【问题标题】:How was this data conversion performed exactly?这种数据转换究竟是如何进行的?
【发布时间】:2016-05-08 03:07:45
【问题描述】:

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

[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)

无论我怎么尝试,我都无法理解这里的确切操作。

【问题讨论】:

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


    【解决方案1】:

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

    根据格式字符串fmt从buffer buffer中解包(大概是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 而不是字符串。

    【讨论】:

    • 感谢 niemmi,但让我感到困惑的是,这种转换究竟是如何发生的。我想要做的是“手动”进行这种转换,而如何做到这一点是我被难住的。我知道前 4 个数字 [16, 130, 164, 65] 不知何故给了我 20.563507080078125,但这究竟是怎么发生的?谢谢!
    • @TheGrapeBeyond:您使用的是哪个 Python 版本?正如我在答案中提到的那样,Python 2 和 3 在这方面的工作方式有所不同。
    • @TheGrapeBeyond:你可以从Wikipedia找到浮点格式的解释。你也可以试试online converter,如果你输入0x41a48210(前4个字节倒序),你会得到第一个数字20.563...。
    • Thakns - 我使用的是 Python 2.7.6。我将看看在线转换器。但是,您是如何从 [16, 130, 164, 65] 转到 0x41a48210 的?干杯。
    • 我阅读了在线计算器,但我仍然感到困惑 - 我不明白确切的数字 16、130、164、65 在哪里以及如何进入转换。我不知道如何从这些数字开始,这样我才能得到 20.563507080078125...
    猜你喜欢
    • 2019-05-24
    • 2016-06-13
    • 1970-01-01
    • 2012-03-18
    • 1970-01-01
    • 2018-03-06
    • 2019-01-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多