2019/04/27(土) [n年前の日記]
#1 [python] Pythonでバイナリファイルを扱う方法を調べてたり
Python でバイナリファイルを扱う方法について調べていたり。環境は Windows10 x64 + Python 2.7.15 32bit。
ファイルの読み込みは、以下でいいらしい。
バイナリの中から、C言語の構造体っぽい形で値を取得するなら、struct というモジュールが使えるようで。
_7.3. struct --- 文字列データをパックされたバイナリデータとして解釈する ・ Python 2.7.16 ドキュメント
こういう感じだろうか。
実行結果。
unsigned char や unsigned short を取り出すフォーマット文字列は分かったけど、文字列を取り出す指定がちょっとよく分からず。"s"を指定すればいいのだろうか…。
こんな感じかな。
実行結果。
こんな感じでいいのだろう。たぶん。
ファイルの読み込みは、以下でいいらしい。
f = open(infile, "rb") buf = f.read() f.close()バイナリが文字列として buf に入るようだなと…。
バイナリの中から、C言語の構造体っぽい形で値を取得するなら、struct というモジュールが使えるようで。
_7.3. struct --- 文字列データをパックされたバイナリデータとして解釈する ・ Python 2.7.16 ドキュメント
こういう感じだろうか。
import struct buf = struct.pack("<BHL", 1, 2, 3) print(repr(buf)) lst = struct.unpack("<BHL", buf) for i, v in enumerate(lst): print("%d : 0x%x" % (i, v))
実行結果。
> python 01_struct.py '\x01\x02\x00\x03\x00\x00\x00' 0 : 0x1 1 : 0x2 2 : 0x3
- struct.pack(フォーマット文字列, 値1, 値2, 値3, ...) で、値をバイナリに変換できる。
- struct.unpack(フォーマット文字列, バイナリ) で、バイナリを値に変換できる。
unsigned char や unsigned short を取り出すフォーマット文字列は分かったけど、文字列を取り出す指定がちょっとよく分からず。"s"を指定すればいいのだろうか…。
こんな感じかな。
import struct buf = struct.pack('<B17s', 2, 'FILENAME') print(repr(buf)) v, s = struct.unpack("<B17s", buf) print(repr(v)) print(repr(s))
実行結果。
>python 02_struct_string.py '\x02FILENAME\x00\x00\x00\x00\x00\x00\x00\x00\x00' 2 'FILENAME\x00\x00\x00\x00\x00\x00\x00\x00\x00'
こんな感じでいいのだろう。たぶん。
[ ツッコむ ]
以上、1 日分です。