繁体   English   中英

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

[英]Converting data to binary using struct in python

我有以下字典,我想以二进制形式写入文件:

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','\\ 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 \\ 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'

在尝试解压缩数据之前,一切正常。 现在,我想读取二进制文件的内容,并将其重新排列成我的字典最初的样子。 这是我尝试打开包装的方法,但始终遇到错误:

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)64位整数:密钥数

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

对于我而言,键数:

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

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

之后,只需确保以相同的字节序进行读写,并且在任何时候指定了无效的长度(太高,太低)都不会使程序崩溃,就可以了。

这个想法是,在解压缩程序中的任何状态下,它要么期望一个长度,要么将数据作为某种内容读取,因此只要遵循该格式,一切开始和结束的位置都是100%明确的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM