【问题标题】:Converting data to binary using struct in python使用python中的struct将数据转换为二进制
【发布时间】:2013-04-30 22:08:17
【问题描述】:

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

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

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

【问题讨论】:

标签: python


【解决方案1】:

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

1) 64位整数:键数

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

对于 i 的键数:

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

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

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

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

【讨论】:

  • 嗨,patashu,是的,我正在考虑为此编写一个自定义函数.. 你认为你是否根据我上面的数据字典给我一个例如你的建议,它看起来对我有用,谢谢你的时间!
  • @user2345778 唯一困难的部分应该是找到一个函数,将 python 数字格式化为 64 位整数二进制数据(或您知道不会超过的任何位数)。
猜你喜欢
  • 2013-01-13
  • 2015-05-05
  • 2014-11-07
  • 2012-06-14
  • 1970-01-01
  • 2016-08-13
  • 2020-08-06
  • 2012-05-11
  • 2017-10-29
相关资源
最近更新 更多