Contents
- 1. structモジュールの使用。 パックされたバイナリデータ
- 2. structモジュールの基本メソッド
- 2.1. pack()メソッドとunpack()メソッド。 データのパックとアンパック
- 2.2. calcsize()メソッド。 パックされたオブジェクトのサイズ
- 3. フォーマットされた文字列
- 3.1. フォーマット文字に基づいたバイトオーダー、サイズ、アライメントの設定
- 3.2. 異なるデータタイプのためのフォーマットされた文字列の例
- 関連トピック
他のWebサイトを検索する:
1. structモジュールの使用。 パックされたバイナリデータ
Pythonのstructモジュールは、文字列からパックされたバイナリデータを作成したり、取り出したりするために使用されます。
このモジュールには、Pythonの値と、Pythonのバイトオブジェクトとして表現されるC言語の構造体との間の変換ツールが含まれています。
⇑
2. structモジュールの基本的なメソッド
structモジュールには、データのパックやアンパックに使用できるいくつかの基本的なメソッドが含まれています。 pack()およびunpack()メソッド。 データのパックとアンパック
データのパックとアンパックには、pack()、unpack()メソッドを使用します。
ドキュメントによると、pack()メソッドを使用する一般的な形式は以下の通りです
obj = struct.pack(format, v1, v2, ...)
where
- format – フォーマット文字列。
- v1, v2, … – パックされる値(オブジェクト)
- obj – パックされたバイナリオブジェクト
unpack()関数は、pack()操作の逆を実行します。 これにより、パックされたオブジェクトに基づいてソースオブジェクトを取得することができます。
obj = struct.unpack(format, buffer)
こちら
- buffer – pack()関数によって以前にパッケージ化されたオブジェクトが書き込まれたバッファです。 このオブジェクトのサイズはformatで指定されたサイズと一致しなければなりません。
- format – アンパックされたバイナリオブジェクトobjが得られるフォーマット文字列
- obj – 結果として得られるオブジェクトで、リスト、タプル、セット、ディクショナリーなどがあります。
unpack()関数を呼び出す場合、format文字列はpack()関数で指定された文字列と一致しなければなりません。 デモのために、数字のリストのパック/アンパックが行われます。
# Module struct. Methods pack(), unpack()# Pack/unpack list of numbers# 1. Specified list of numbersLS = # 2. Include module structimport struct# 3. Pack list of numbers. Method pack()pack_obj = struct.pack('>4і', LS, LS, LS, LS)# 4. Display the object pack_objprint('pack_obj = ', pack_obj)# 5. Unpack list of numbers. Method unpack().# The result is a tuple T2T2 = struct.unpack('>4і', pack_obj) # T2 = (1, 3, 9, 12)# 6. Print the unpacked object T2print('T2 = ', T2)# 7. Convert tuple T2 to list LS2LS2 = list(T2) # LS2 = # 8. Display the list LS2print('LS2 = ', LS2)
プログラムの結果
pack_obj = b'\x00\x00\x00\x01\x00\x00\x00\x03\x00\x00\x00\t\x00\x00\x00\x0c'T2 = (1, 3, 9, 12)LS2 =
⇑
2.2. メソッドcalcsize()。 パックされたオブジェクトのサイズ
calcsize()メソッドは、pack()メソッドで作成されたオブジェクトのサイズを返します。
例を示します。
# Module struct.# Method calcsize(). Determine the size of the packed object# 1. Include module structimport struct# 2. Determine the size of a packed list of numbers# 2.1. Specified list of floating point numbersLS = # 2.2. Pack list LS. Method pack()pack_obj = struct.pack('>3f', LS, LS, LS)# 2.3. Display the packed object pack_objprint('pack_obj = ', pack_obj)# 2.4. Display the size of pack_objsize = struct.calcsize('>3f') # size = 12print('size = ', size)# 3. Determine the size of a packed tuple of strings# 3.1. The specified tuple of two stringsTS = ( 'Hello', 'abcd')# 3.2. Pack the tuple TSpack_obj = struct.pack('<5s4s', TS.encode(), TS.encode())# 3.3. Display the packed objectprint('pack_obj = ', pack_obj)# 3.4. Display the size of packed tuplesize = struct.calcsize('<5s4s') # size = 9print('size = ', size)
プログラムの結果
pack_obj = b'@8Q\xec@y\x99\x9a\xc1(\x00\x00'size = 12pack_obj = b'Helloabcd'size = 9
⇑
3. 整形された文字列
3.1. フォーマット文字に基づいてバイトオーダー、サイズ、アライメントを設定する
Pythonでは、文字列をパックする方法は、フォーマット文字列の最初の文字に基づいて決定されます。
- バイトオーダーは @, =, <>, ! このパラメータが指定されていない場合は、@の記号が使用されます。
- パックされたデータのバイト数です。 この場合、数字を示すものが最初に使われます;
- システムで設定されるアライメント
フォーマット文字列のPythonのドキュメントによると、バイトオーダー、サイズ、アライメントは、フォーマットの最初の文字に従って形成されます。
Pythonのドキュメントによると、フォーマットの最初の文字に従ってバイトオーダー、サイズ、アライメントが形成されます。
文字 | バイトオーダー | サイズ | アライメント |
@ | ネイティブ(ホスト依存) | Native | Native |
= | Native | スタンダード | none |
< | little-エンディアン | スタンダード | ナシ |
> | ビッグエンディアン | スタンダード | ノーン |
! | ネットワーク(=ビッグ | standard | none |
バイトオーダーの値は4つのうちの1つです。
- ネイティブな順序。 この順序はリトルエンディアンまたはビッグエンディアンのいずれかです。
- native order.この順序はリトルエンディアンまたはビッグエンディアンのいずれかで、ホストシステムによって決定されます。 この場合、下位バイトが先に処理され、次に上位バイトが処理されます。
- ビッグエンディアン型の順序。 この場合、上位バイトが先に処理され、次に下位バイトが処理されます。
- ネットワークオーダー(デフォルトではビッグエンディアンオーダー)
- ネットワークオーダー(デフォルトではビッグエンディアンオーダー)。
パックデータのサイズは次の2つのうちのいずれかです。
- ネイティブ – C コンパイラの sizeof 命令を使用して定義されます
- 標準 – 以下の表に従ってフォーマット文字に基づいて決定されます
表. 書式文字に応じたパックデータの標準サイズの定義
フォーマット | Cタイプ | Python タイプ | 標準サイズ |
x | パッドバイト | 値なし | |
c | char | bytes of length 1 | 1 |
b | signed char | 整数 | 1 |
B | unsigned char | integer | 1 |
? | _Bool | _bool | _1 |
_h | short | integer | 2 |
H | unsigned short | integer | 2 |
i | int | integer | 4 |
I | unsigned int | 整数 | 4 |
L | long | 整数 | 4 |
L | unsigned long | integer | 4 |
q | long long | integer | 8 |
Q | unsigned long long | integer | 8 |
n | ssize_t | integer | |
N | size_t | integer | |
e | float (exponential format) | float | 2 |
f | float | float | 4 |
d | double | float | 8 |
s | char | bytes | |
p | char | bytes | |
P | void* | 整数 |
⇑
3.2. 異なるデータタイプに対するフォーマットされた文字列の例
h5