ホームページ >バックエンド開発 >Python チュートリアル >Python 構造体バイト ストリーム、グループ化およびアンパック実装モジュールの詳細な説明
英語の struct という単語は誰もがよく知っているはずです。C/C++ には struct があり、struct は structur と呼ばれます。 Struct は Python でも使用されており、この構造体が C/C++ の構造体と深い起源を持つ必要があることを十分に示しています。 Python は、struct モジュールを使用して Python 値と C 構造体間の変換を実行し、Python バイト オブジェクトを形成します。基礎となる C 構造の簡潔な記述として形式 string を使用し、この形式文字列に基づいて 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 つの整数を文字列 (バイト ストリーム) に変換します。 ;> str=struct.pack('ii',a,b) #バイトストリームに変換します、まだ文字列ですがネットワーク上で送信できます
>>> str) #Binary は意味不明
> ここからはやりたいことを何でもできる パッキングが完了しました。たとえば、次のパッケージング例ではパックのみが紹介されています
format = "!HH%ds" % len(data)
buffer = struct.pack(format,opcode,blocknumber,data) 以下のフォーマット文字情報に基づいて、データをパックし、いくつかのヘッダーを追加する必要があります。H は符号なし、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」を参照してください。 " は、8 バイトの str を 4 バイトを境界として 2 つの int 型整数に分割します。
struct.calcsize(): 特定の形式での出力のサイズを計算するために使用されます。これは次のようなものです:
>>> struct.calcsize('HH4s')
8
>> ;> struct.calcsize('ii')
8
>>>
>>> format='!HH%ds' % len('hello Python')
>> struct.calcsize(形式)
>>>
以上がPython 構造体バイト ストリーム、グループ化およびアンパック実装モジュールの詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。