ホームページ >バックエンド開発 >Python チュートリアル >Pythonの構造体(バイトストリーム、グループ化、アンパック実装)モジュールの詳細説明

Pythonの構造体(バイトストリーム、グループ化、アンパック実装)モジュールの詳細説明

高洛峰
高洛峰オリジナル
2016-10-19 11:12:052084ブラウズ

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

>>>

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
前の記事:Python上級01辞書次の記事:Python上級01辞書