人気ブログランキング | 話題のタグを見る

まぁ、いろいろと・・・


by ex_n-imai
カレンダー
S M T W T F S
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31

Python でバイナリデータを読む

C の場合、構造体を使用してバイナリデータの中身を取得するが、Python の場合、ひと手間必要になる。
ビットマップ画像の先頭 14 バイトには、BMPFILEHEADER 構造体が格納されているが、これを Python で取得してみる。

まず、バイナリデータを読み込むために struct モジュールを import する。
import struct
filename = "sample.bmp"
次に構造体のサイズを算出する。
BMPFILEHEADERSIZE = struct.calc("<2sLHHL")
"<2sLHHL" は構造体の各項目の型を表している。
BMPFILEHEADER は、C で表記すると、以下の構造体になる。
typedef struct tagBITMAPFILEHEADER {
unsigned short bfType;
unsigned long bfSize;
unsigned short bfReserved1;
unsigned short bfReserved2;
unsigned long bfOffBits;
} BITMAPFILEHEADER
unsinged short の場合、"H"、unsinged long の場合、"L"とする。なお、文字の場合、"(バイト数)s"とする。また、"<" はバイトオーダーを示す。
bfType は、unsigned short であるため、"<HLHHL"でもよいが、bfType は文字列 "BM" となるため、"<2sLHHL" としている。

構造体のサイズを取得したのち、ファイルから該当サイズのデータを取得する。
fo = o pen(filename, "rb")
raw_bmpfileheader = fo.read(BMPFILEHEADERSIZE)
取出したデータは Python では処理できないため、構造体の各項目に分解する。
bmpfileheader = struct.unpack("<2sLHHL", raw_bmpfileheader)
print bmpfileheader

by ex_n-imai | 2010-05-25 04:02 | Python