Python structパック、アンパック

Pythonのstruct モジュールは、Pythonの値とCの構造体の変換を行うことができます。これらの構造体は、Pythonの文字列として表されます。

Python Struct

  • Pythonのstructモジュールは、ファイル、データベース、ネットワーク接続などに格納されているバイナリデータの処理に使用することができます。
  • これは、Cの構造体のレイアウトとPythonの値への変換をコンパクトな形式で指定するためにフォーマット文字列を使用します。

Python Structの関数

structモジュールには、pack()unpack()calcsize()pack_into()unpack_from()の5つの重要な関数があります。これらの関数では、バイナリに変換するデータのフォーマットを指定する必要があります。一部の人気のあるフォーマット文字は次のとおりです:

?: boolean
h: short
l: long
i: int
f: float
q: long long int

フォーマット文字の完全なリストは、こちらで確認できます。では、structモジュールの関数を一つずつ見ていきましょう。

Python struct.pack()

この関数は、指定された型の文字列表現に値のリストをパックします。引数は、書式に必要な値と完全に一致する必要があります。struct pack()の例を簡単に見てみましょう:

import struct

var = struct.pack('hhl', 5, 10, 15)
print(var)
 
var = struct.pack('iii', 10, 20, 30)
print(var)

このスクリプトを実行すると、次の表現が得られます:出力の ‘b’ はバイナリを表します。

Python struct.unpack()

この関数は、指定された書式でパックされた値を元の表現に展開します。この関数は常にタプルを返しますが、要素が1つしかない場合でもです。struct unpack()関数の例を簡単に見てみましょう:

import struct
var = struct.pack('hhl', 5, 10, 15)
print(var)
print(struct.unpack('hhl', var))

このスクリプトを実行すると、元の表現が得られます:明らかに、Python インタプリタに展開する値の書式を伝える必要があります。

Python struct calcsize()

この関数は、指定されたフォーマットの構造体の文字列表現のサイズを計算し、バイト単位で返します。以下は例のコードスニペットです:

import struct
 
var = struct.pack('hhl', 5, 10, 15)
print(var)
print("Size of String representation is {}.".format(struct.calcsize('hhl')))

このスクリプトを実行すると、次の表現が得られます:

Python struct pack_into()、unpack_from()

これらの関数は、値を文字列バッファにパックしたり、文字列バッファからアンパックすることを可能にします。これらの関数はバージョン2.5で導入されました。

import struct
# ctypesが文字列バッファを作成するためにインポートされています
import ctypes

# 前述の例に示すように
size = struct.calcsize('hhl')
print(size)

# 'buff'というバッファがctypesから作成されます
buff = ctypes.create_string_buffer(siz)

# struct.pack_into()はデータをbuffにパックし、値を返しません
# struct.unpack_from()はbuffからデータをアンパックし、値のタプルを返します
print(struct.pack_into('hhl', buff, 0, 5, 10, 15))
print(struct.unpack_from('hhl', buff, 0))

このスクリプトを実行すると、次の表現が得られます: これは Python の簡単な紹介のすべてです struct モジュール。

Source:
https://www.digitalocean.com/community/tutorials/python-struct-pack-unpack