2008年5月12日月曜日

python で pack/unpack

今日は一日これに時間を費やしてしまった...

例えば,Cで言う以下の感じのデータを pack/unpack したいと思ったとする.

struct obj {
    unsigned short flen;  /* 次にくるファイル名(fname)の長さ */
    unsigned char  *fname;/* ファイル名の文字列 */
    unsigned short line;  /* ファイルの行数 */
};
※ ただし,なんでかわからないけど,fname は UTF-8 .

pack する時には,
fname = fname.encode('utf-8')
flen = len(fname)
line = "wc -l fname 的なコード"
str = pack('H%dsH' % flen, flen, fname, line)

unpackする時には,少し面倒だけど,

flen = struct.unpack('H', str[0:2])
cur += 2
file = struct.unpack('%ds' % flen[0], str[cur:cur+flen[0]])
cur += flen[0]
line = struct.unpack('H', str[cur:cur+2])
print flen, file, line

とすればよいみたい.
unpack の返り値はタプルなので,上のような取り出し方をする場合には,
flen[0] のように取り出さないといけないみたい.めんどいな.

0 件のコメント: