C/C++ には struct があり、struct は構造体と呼ばれるため、誰もが英語の struct という単語に精通しているはずです。 Struct は Python でも使用されます。これは、この構造体が C/C++ の構造体と深い起源を持つ必要があることを十分に示しています。 Python は、struct モジュールを使用して Python 値と C 構造体間の変換を実行し、Python バイト オブジェクトを形成します。基礎となる C 構造の簡潔な記述としてフォーマット文字列を使用し、このフォーマット文字列に基づいて Python 値に変換します。
Python では文字列、整数、浮動小数点数、リスト、タプル、辞書の 6 つのデータ型しか定義されていないことがわかっています。しかし、C言語にはバイト型の変数がいくつかありますが、それらをPythonで実装するにはどうすればよいですか?これは、特にデータがネットワーク上で転送される場合には非常に重要です。
Python は、変換を行うための struct モジュールを提供します。このモジュールにはいくつかのメソッドがあります。
pack(fmt, v1, v2, ...) ------- 値 v1, v2, ... を、指定された fmt で記述された形式に従って文字列に変換します。
unpack(fmt, bytes) ------- 指定された fmt で記述された形式に従ってバイトを逆解析し、タプルを返します。
calcsize(fmt) ------- 指定された fmt で記述された形式に従って構造体のサイズを返します。
struct.pack():
struct.packは、フォーマット文字に従ってPythonの値を文字列に変換するために使用されます(Pythonにはバイト(Byte)型がないため、ここでの文字列はバイトとして理解できます)ストリーム 、またはバイト配列)。関数のプロトタイプは struct.pack(fmt, v1, v2, ...) で、パラメーター fmt はフォーマット文字列です。フォーマット文字列に関する関連情報は以下に紹介されています。 v1、v2、... は変換される Python 値を表します。次の例では、2 つの整数を文字列 (バイト ストリーム) に変換します。
>>> import struct
>>> a=20
>>> b=400
>>> str=struct.pack ('ii' ,a,b) #バイトストリームに変換します。これはまだ文字列ですが、ネットワーク上で送信できます
>>> print len(str) #ii は 2 つの int を表します
8長さは 8 バイトです。これは、ちょうど 2 つの int 型データの長さです
>>> print str
#ここで、16 進数の 0x00000014、0x00001009 は、それぞれ 20 と 400 を意味します
>>>>
ここから、次のようにパッケージを任意にグループ化できます。パックのみを紹介するパッケージ化の例です
format = "!HH% ds" % len(data)
buffer = struct.pack(format,opcode,blocknumber,data)
データをパックする必要があります次のフォーマット文字情報に基づいて、H は unsigned short で 2 バイト、s は char 型であることがわかります。したがって、このバッファは 2 バイトのオペコード、2 バイトのブロック番号、および len-long char です。
Python モジュール - 構造体 (バイト ストリーム、グループ化およびアンパックの実装)
struct.unpack():
上記の例を続けて実行しましょう:
>>> a1,a2=struct.unpack( 'ii ',str)
>>> print 'a1',a1
a1 20
>>> print 'a2=',a2
a2= 400
「ii」が4文字で始まっていることがわかります。を区切りとして、8バイトのstrを2つのint型整数に分割します。
struct.calcsize(): 特定の形式での出力のサイズを計算するために使用されます。これは、次のような数バイトです:
>>> struct.calcsize('HH4s')
8
>> > struct.calcsize ('ii')
8
>>>>
>>> format='!HH%ds' % len('hello python')
>>> struct.calcsize(format)
16
>>>