Python の struct モジュールを使用してバイト ストリーム/バイナリ ストリームを操作する方法のチュートリアル

高洛峰
リリース: 2017-02-20 10:46:06
オリジナル
1770 人が閲覧しました

最近、Pythonのネットワークプログラミングを勉強していて、簡単なソケット通信のコードを書いているときに、structモジュールの使い方を知りました。その後、それが何をするのかよくわかりませんでした。この記事では主に Python の struct モジュールによるバイトストリーム/バイナリストリームの操作について説明します。必要な方は参考にしてください。

はじめに

最近、私はPythonを使用してIDXファイル形式のMNISTデータセットを解析し、structモジュールを使用したバイナリファイルを読み取る必要がありました。インターネットで多くのチュートリアルをチェックしましたが、どれも非常に優れていましたが、初心者にはあまり親切ではなかったので、すぐに始められるようにいくつかのメモを再構成しました。

注: 次の 4 つの名詞は、チュートリアルでは同義です: バイナリ ストリーム、バイナリ配列、バイト ストリーム、バイト配列

すぐに始めましょう

struct モジュールで、整数を追加します数値、浮動小数点数、または文字ストリーム (文字配列) をバイト ストリーム (バイト配列) に変換するには、フォーマット文字列 fmt を使用して、変換されるオブジェクトのタイプを struct モジュールに伝える必要があります。たとえば、整数値は 'i '、浮動小数点数は 'f'、ASCII 文字は 's' です。

def demo1():
 # 使用bin_buf = struct.pack(fmt, buf)将buf为二进制数组bin_buf
 # 使用buf = struct.unpack(fmt, bin_buf)将bin_buf二进制数组反转换回buf

 # 整型数 -> 二进制流
 buf1 = 256
 bin_buf1 = struct.pack('i', buf1) # 'i'代表'integer'
 ret1 = struct.unpack('i', bin_buf1)
 print bin_buf1, &#39; <====> &#39;, ret1

 # 浮点数 -> 二进制流
 buf2 = 3.1415
 bin_buf2 = struct.pack(&#39;d&#39;, buf2) # &#39;d&#39;代表&#39;double&#39;
 ret2 = struct.unpack(&#39;d&#39;, bin_buf2)
 print bin_buf2, &#39; <====> &#39;, ret2

 # 字符串 -> 二进制流
 buf3 = &#39;Hello World&#39;
 bin_buf3 = struct.pack(&#39;11s&#39;, buf3) # &#39;11s&#39;代表长度为11的&#39;string&#39;字符数组
 ret3 = struct.unpack(&#39;11s&#39;, bin_buf3)
 print bin_buf3, &#39; <====> &#39;, ret3

 # 结构体 -> 二进制流
 # 假设有一个结构体
 # struct header {
 # int buf1;
 # double buf2;
 # char buf3[11];
 # }
 bin_buf_all = struct.pack(&#39;id11s&#39;, buf1, buf2, buf3)
 ret_all = struct.unpack(&#39;id11s&#39;, bin_buf_all)
 print bin_buf_all, &#39; <====> &#39;, ret_all
ログイン後にコピー

出力結果は以下の通りです

Python の struct モジュールを使用してバイト ストリーム/バイナリ ストリームを操作する方法のチュートリアル
demo1の出力結果

structモジュールの詳細説明

主な機能

構造体の重要な関数モジュールは pack() , unpack() , calcsize()

# 按照给定的格式化字符串,把数据封装成字符串(实际上是类似于c结构体的字节流)
string = struct.pack(fmt, v1, v2, ...)

# 按照给定的格式(fmt)解析字节流string,返回解析出来的tuple
tuple = unpack(fmt, string)

# 计算给定的格式(fmt)占用多少字节的内存
offset = calcsize(fmt)
ログイン後にコピー

struct のフォーマット文字列

struct でサポートされているフォーマットは次のとおりです:


bsign ed charinteger1Bunsigned charinteger1?_Boolbool1hshort整数2H符号なし short integer2iintinteger4Iunsigned intinteger または lon4 l long整数 4H 8f floatfloat4ddoublefloat8 schar[]string 1pchar[]string * 数値を表す数値を 1 つ持つことができます 注 4: P はポインターの変換に使用され、その長さはマシン語の長さに関係します 注 5: 最後のものは、ポインターの型を表すために使用でき、4 バイトを占めますC の構造体とデータを交換するには、C または C++ のコンパイルも考慮する必要があります。プロセッサはバイト アライメントを使用し、通常は 4 バイトを単位とする 32 ビット システムであるため、構造体はローカル マシンのバイト オーダー。フォーマットの最初の文字を使用してアライメントを変更できます。定義は次のとおりです。 ネイティブネイティブ 4バイトを構成します=ネイティブ元のバイト数に従った標準リトルエンディアン元のバイト数に従った標準>ビッグエンディアン元のバイト数に従った標準
Format C Type Python バイト数
x パッドバイト 値なし 1
c char 長さの文字列1 1
注 3: s 形式は特定の長さの文字列を表し、4s は長さ 4 の文字列を表します。ただし、p はパスカル文字列を表します


!


ネットワーク(=ビッグエンディアン)

元のバイト数に従った標準


の方法使い方は、'@5s6sif' のように fmt の最初の位置に置くことです


バイト ストリーム/バイナリ ストリーム用の Python のその他の構造体モジュール 操作チュートリアルに関連する記事については、PHP 中国語 Web サイトに注目してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!