使用python中的struct将数据转换为二进制

时间:2013-05-07 03:42:34

标签: python

我有以下dict,我想用二进制文件写入文件:

data = {(7, 190, 0): {0: 0, 1: 101, 2: 7, 3: 0, 4: 0}, 
        (7, 189, 0): {0: 10, 1: 132, 2: 17, 3: 20, 4: 40}}

我继续以这种方式使用struct模块:

packed=[]
for ssd, add_val in data.iteritems():
    # am trying to using 0xcafe as a marker to tell me where to grab the keys 
    pack_ssd = struct.pack('HBHB', 0xcafe, *ssd) 
    packed.append(pack_ssd)
    for add, val in data[ssd].iteritems():
        pack_add_val = struct.pack('HH', add, val)
        packed.append(pack_add_val)

此输出打包= [' \ xfe \ xca \ x07 \ x00 \ xbe \ x00 \ x00',' \ x00 \ x00 \ x00 \ x00',& #39; \ x01 \ x00e \ x00',' \ x02 \ x00 \ x07 \ x00',' \ x03 \ x00 \ x00 \ x00',' \ x04 \ x00 \ x00 \ x00',' \ xfe \ xca \ x07 \ x00 \ xbd \ x00 \ x00',' \ x00 \ x00 \ n \ x00',& #39; \ x01 \ x00 \ x84 \ x00',' \ x02 \ x00 \ x11 \ x00',' \ x03 \ x00 \ x14 \ x00',&#39 ; \ X04 \ X00(\ X00']

之后我把它写成二进制文件:

ifile = open('test.bin', 'wb')
for pack in packed:
    ifile.write(pack)

这是二进制文件的样子: ' \ XFE \ XCA \ X07 \ X00 \ XBE \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X01 \ x00e \ X00 \ X02 \ X00 \ X07 \ X00 \ X03 \ X00 \ X00 \ X00 \ X04 \ X00 \ X00 \ X00 \ XFE \ XCA \ X07 \ X00 \ XBD \ X00 \ X00 \ X00 \ X00 \ n \ X00 \ X01 \ X00 \ X84 \ X00 \ X02 \ X00 \ X11 \ X00 \ X03 \ X00 \ X14 \ X00 \ X04 \ X00(\ X00'

在我尝试解压缩数据之前一切正常。现在我想阅读二进制文件的内容,并将其重新安排到我的dict首先看起来如何。这就是我试图解压缩的方法,但我总是收到错误:

unpack=[]
while True:
chunk = ifile.read(log_size)
if len(chunk) == log_size:
    str = struct.unpack('HBHB', chunk)
    unpack.append(str)
    chunk = ifile.read(log1_size)
    str= struct.unpack('HH', chunk)
    unpack.append(str)

Traceback (most recent call last):
File "<interactive input>", line 7, in ?
error: unpack str size does not match format

我意识到我试图解压缩的方法总会遇到问题,但我似乎找不到解压缩二进制文件内容的好方法。非常感谢任何帮助..

1 个答案:

答案 0 :(得分:1)

如果您需要编写自定义内容,我建议您执行以下操作:

1)64位整数:键数

2)64位整数* 3 *键数:键元组数据

表示我的钥匙数量:

3i)64位整数:字典i的键数

4i):64位整数* 2 * i的键数:关键数据,值数据,关键数据,值数据......

之后,请确保您使用相同的endianness进行读写操作,并且在任何时候指定无效长度(太高,太低)都不会导致程序崩溃并且您很好。

这个想法是,在解包器中的任何状态下,它要么想要一个长度,要么将数据读取为某个东西,所以只要你遵循格式就可以100%明确地说明所有事情的开始和结束。