我有以下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
我意识到我试图解压缩的方法总会遇到问题,但我似乎找不到解压缩二进制文件内容的好方法。非常感谢任何帮助..
答案 0 :(得分:1)
如果您需要编写自定义内容,我建议您执行以下操作:
1)64位整数:键数
2)64位整数* 3 *键数:键元组数据
表示我的钥匙数量:
3i)64位整数:字典i的键数
4i):64位整数* 2 * i的键数:关键数据,值数据,关键数据,值数据......
之后,请确保您使用相同的endianness进行读写操作,并且在任何时候指定无效长度(太高,太低)都不会导致程序崩溃并且您很好。
这个想法是,在解包器中的任何状态下,它要么想要一个长度,要么将数据读取为某个东西,所以只要你遵循格式就可以100%明确地说明所有事情的开始和结束。