1

我有以下要写入二进制文件的字典:

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)

这个的输出是packed = ['\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']

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

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

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

4

1 回答 1

1

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

1)64位整数:键数

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

对于 i 的键数:

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

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

在那之后,只要确保你以相同的字节顺序读写,并且在任何时候指定一个无效的长度(太高,太低)不会让你的程序崩溃,你很好。

这个想法是,在解包器的任何状态下,它要么期望一个长度,要么将数据作为某种东西读取,因此只要你遵循格式,一切开始和结束的地方都是 100% 明确的。

于 2013-05-07T03:49:59.300 回答