最近、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, ' <====> ', ret1 # 浮点数 -> 二进制流 buf2 = 3.1415 bin_buf2 = struct.pack('d', buf2) # 'd'代表'double' ret2 = struct.unpack('d', bin_buf2) print bin_buf2, ' <====> ', ret2 # 字符串 -> 二进制流 buf3 = 'Hello World' bin_buf3 = struct.pack('11s', buf3) # '11s'代表长度为11的'string'字符数组 ret3 = struct.unpack('11s', bin_buf3) print bin_buf3, ' <====> ', ret3 # 结构体 -> 二进制流 # 假设有一个结构体 # struct header { # int buf1; # double buf2; # char buf3[11]; # } bin_buf_all = struct.pack('id11s', buf1, buf2, buf3) ret_all = struct.unpack('id11s', bin_buf_all) print bin_buf_all, ' <====> ', ret_all
出力結果は以下の通りです
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 でサポートされているフォーマットは次のとおりです:
Format | C Type | Python | バイト数 |
---|---|---|---|
x | パッドバイト | 値なし | 1 |
c | char | 長さの文字列1 | 1 |
sign ed char | integer | 1 | |
unsigned char | integer | 1 | |
_Bool | bool | 1 | |
short | 整数 | 2 | |
符号なし short | integer | 2 | |
int | integer | 4 | |
unsigned int | integer または lon | 4 | |
long | 整数 | 4 | |
8 | f | float | |
4 | d | double | |
8 | s | char[] | |
1 | p | char[] | |
注 3: s 形式は特定の長さの文字列を表し、4s は長さ 4 の文字列を表します。ただし、p はパスカル文字列を表します | 注 4: P はポインターの変換に使用され、その長さはマシン語の長さに関係します | ||
C の構造体とデータを交換するには、C または C++ のコンパイルも考慮する必要があります。プロセッサはバイト アライメントを使用し、通常は 4 バイトを単位とする 32 ビット システムであるため、構造体はローカル マシンのバイト オーダー。フォーマットの最初の文字を使用してアライメントを変更できます。定義は次のとおりです。 | ネイティブ | ネイティブ 4バイトを構成します | |
ネイティブ | 元のバイト数に従った標準 | ||
元のバイト数に従った標準 | > | ビッグエンディアン |
ネットワーク(=ビッグエンディアン)
元のバイト数に従った標準
バイト ストリーム/バイナリ ストリーム用の Python のその他の構造体モジュール 操作チュートリアルに関連する記事については、PHP 中国語 Web サイトに注目してください。