【问题标题】:Fixed-Point binary unpacking in pythonpython中的定点二进制解包
【发布时间】:2017-11-07 21:43:15
【问题描述】:

我正在努力解决 Python 3.6 中的数字格式问题。我的目标是将文件中的二进制数据转换为可打印的十进制数字。例如,我需要将两个 little-endian 字节转换为字节串的形式...

b'\x12\00'

变成它的大端二进制形式...

0000000000010010

最后是它的16-bit fixed-point Q15十进制数字形式...

(1 / 4096) + (1 / 16384) = 0.00030517578(基本上,我们已将上面的 2 个字节设为人类可读)

在我失败的尝试中,struct.unpack 函数看起来很有希望,但我的低级/数字表示经验目前还不是很成熟。

尝试失败:

struct.unpack('<h', b'\x12\x00') # Yields (18,)

上面的代码让我得到“18”,如果字节表示一个整数,那就没问题了,但事实并非如此。

任何帮助/建议将不胜感激。谢谢!

【问题讨论】:

  • 字节确实代表一个整数 - 已被移动了 15 位。除以 32768 (2**15) 得到实际的 Q15 值。 (这与您计算的值不匹配,但那是因为您做错了数学 - 这两个设置位实际上具有 1/2048 和 1/16384 的位置值。)
  • @jasonharper 你说得对——很好!您的解决方案有效,我相信我理解您的方法。谢谢!

标签: python python-3.x binary binaryfiles unpack


【解决方案1】:

@jasonharper 在问题 cmets 中回答--

字节确实代表一个整数 - 已移位 15 位。除以 32768 (2**15) 得到实际的 Q15 值。 (这与您计算的值不匹配,但那是因为您做错了数学 - 这两个设置位实际上具有 1/2048 和 1/16384 的位置值。)

我通过以下代码实现了正确的值--

struct.unpack('<h', b'\x12\x00')[0] / (2**15)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-03
    相关资源
    最近更新 更多