文字列データをパックされたバイナリデータとして解釈するもう一つの方法

http://www.python.jp/doc/nightly/library/struct.html

このモジュールは、 Python の値と Python 上で文字列データとして表される C の構造体データとの間の変換を実現します。

との事なのですが、Cの構造体データとの変換にしては、フォーマット文字列がステキにコンパクトすぎます。実用的なCの構造体データは入れ子になっています。そんなにフラットな物じゃないし、このままではpackもunpackも結構めんどうです。実際使おうとすると途方に暮れます。

そのまま自分が使いやすいように何かで包んであげる手もありますが、Cの構造体データなのでctypesを使います。構造体の定義はおおむねこんな感じ。Cのヘッダファイルからエディタのマクロで編集できそうです。

from ctypes import *

class HEADER(Structure):
    _fields_ = [
        ('len',  c_char * 8),
        ('code', c_char * 7),
        ('type', c_char),
        ('flg',  c_char),
        ]

class DATA(Structure):
    _fields_ = [
        ('header',  HEADER),
        ('len',  c_char *  9),
        ('data', c_char *  256),
        ]

使うときはこんな感じ。

from ctypes import *

data = DATA()
buff = ' ' * sizeof(data)
memmove(addressof(data), buff, sizeof(data))

わ、なんか気持ち悪いね。間違うと簡単にセグメンテーション違反を起こします。

数値とか日本語とか扱ったらどうなるのかは今回必要がないので試してません。