如何准确执行此数据转换?

时间:2016-05-08 03:07:46

标签: python binary type-conversion bit-manipulation unpack

所以,长话短说,我试图自己“解压缩”一些数据,但我无法这样做。幸运的是我有解决方案,但我无法弄清楚方法。基本上,我在这里有这个数据数组,

  

[16 130 164 65 103 136 209 64 19 36 185 190 83]

,我被告知当通过'fffB''解包'时,我得到:

  

[20.56350708,6.54790068,-0.36160335,83]

我知道这个解决方案是正确的,但我不确定我们是如何实现的。

这里的上下文是输入数组'解包',使用Python的命令如下:

struct.unpack_from('fffB', input)

不过尽量尝试,我无法理解这里的确切操作。

1 个答案:

答案 0 :(得分:1)

首先,您需要将数字列表转换为字符串,因为这是unpack所期望的:

  

根据格式字符串fmt从缓冲区缓冲区(可能由pack(fmt,...)打包)解压缩。结果是一个元组,即使它只包含一个项目。缓冲区的大小(以字节为单位)必须与格式所需的大小相匹配,如calcsize()所示。

列表中的数字可以转换为chr的字符,一旦join将它们组合在一起,您就可以输入unpack

import struct

d = [16, 130, 164, 65, 103, 136, 209, 64, 19, 36, 185, 190, 83]
s = ''.join(chr(x) for x in d) # s = bytearray(d) on Python 3

struct.unpack('fffB', s) # (20.563507080078125, 6.547900676727295, -0.36160334944725037, 83)

格式字符串fffB告诉unpack提取三个4字节的浮点数和一个1字节的无符号字符大小。总共提取了13个字节,与您的数据长度相匹配。格式字符的确切规范可以从Python documentation找到。

请注意,上面的示例仅适用于Python 2.x,在Python 3.x上,您需要将列表转换为bytearray而不是字符串。