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

在python中使用struct将数据转换为二进制,python,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

我有以下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\xfe\xE\xE\xE\xE\xE\xE\xC\x10\x10\x10\x10\x0\x0\x07\x07\x0\x0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\00\x00\00 00 00\00 00 00 00 00\x00\00 00 00 00 00\x00 00 00\00\x00\00 00\00\x00\00 00 00\x00 00 00 00\x00\x00\x00\x00\x00\x00\x00 00 00\00 00 00\00 00 00 00\00 00\x00\x00\00\x00\xx04\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\xAE\x07\x00\x00\x00\x00\x00\x00\x00\n\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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
unpack=[]
尽管如此:
chunk=ifile.read(日志大小)
如果len(chunk)=日志大小:
str=struct.unpack('HBHB',chunk)
解包.追加(str)
chunk=ifile.read(日志1\u大小)
str=struct.unpack('HH',chunk)
解包.追加(str)
回溯(最近一次呼叫最后一次):
文件“”,第7行,在?
错误:解包str大小与格式不匹配

我意识到我尝试解包的方法总是会遇到问题,但我似乎找不到解包二进制文件内容的好方法。非常感谢您的帮助。

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

1) 64位整数:密钥数

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

对于i,键的数量为:

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

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

在这之后,只需确保您的读写操作是相同的,并且在任何点指定无效的长度(太高或太低)都不会使您的程序崩溃,这样您就可以了


其思想是,在解包的任何状态下,它要么期望长度,要么将数据作为某种东西读取,因此,只要您遵循格式,所有内容的开始和结束都是100%明确的。

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

1) 64位整数:密钥数

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

对于i,键的数量为:

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

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

在这之后,只需确保您的读写操作是相同的,并且在任何点指定无效的长度(太高或太低)都不会使您的程序崩溃,这样您就可以了


其思想是,在解包的任何状态下,它要么期望长度,要么读取数据作为某种东西,因此,只要您遵循格式,一切开始和结束的位置都是100%明确的。

除非这是家庭作业,除非这是家庭作业,hi patashu,是的,我正在为此编写自定义函数。。根据我上面的数据,你认为你能给我一个例子吗?看起来对我有用,谢谢@user2345778唯一困难的部分应该是找到一个将python数字格式化为64位整数二进制数据的函数(或者任何你知道的位数都不会超过)。hi patashu,是的,我正在考虑为此编写一个自定义函数。。根据我上面的数据,你认为你能给我一个例子吗?看起来对我有用,谢谢@user2345778唯一困难的部分应该是找到一个函数,该函数将python数字格式化为64位整数二进制数据(或者不超过您知道的任何位数)。