猫型エンジニアのブログ

プログラム/ネットワーク系の技術関連をまとめたページです 

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'