Pythonでバイナリデータの取り扱い
Pythonでパケット処理をする際に勉強する必要があったため、PythonのStructクラスのpackおよびunpackに関してまとめてみました。それぞれバイナリデータ⇔C言語の構造体の変換を行います。
unpack関数
struct.unpack(fmt, string)
与えられたバイナリデータを、フォーマットとに従って解釈した結果をタプルで返します。フォーマットでの指定の仕方は公式ドキュメントを参考にしてください。
バイナリデータをunsigned_short型に変換する
"FFFF"をunsigned_short型として解釈させます。
>>> from struct import * >>> binary_data = '\xFF\xFF' >>> unpack('H',binary_data) (65535,)
バイナリデータをshort型に変換する
同じバイナリでも今度は符号付のshortのため、-1として解釈されます。
>>> from struct import * >>> binary_data = '\xFF\xFF' >>> unpack('h',binary_data) (-1,)
バイナリデータをchar型に変換する
AsciiフォーマットでAは0x41になります。このデータをchar型として解釈させます。
>>> from struct import * >>> binary_data = '\x41' >>> unpack('c',binary_data) ('A',)
pack関数
pack関数の反対で、与えられた数値を、フォーマットに従ってバイナリデータに変換します。
数値をunsigned_short型のバイナリデータに変換する
>>> from struct import * >>> pack('H',65535) '\xff\xff'
数値をshort型のバイナリデータに変換する
>>> from struct import * >>> pack('h',-1) '\xff\xff'