解码 IEEE 双精度浮点数(8 字节)

Decoding an IEEE double precision float (8 byte)

我正在解码 AMF0 格式文件。我正在寻找的数据是一个时间戳,编码为一个数组。 [HH, MM, SS].

由于数据是 AMF0,我可以通过以字节形式读入文件、将每个字节转换为十六进制并查找信号 08 00 00 00 03(长度为 3 的数组)来定位数据的开头。

我的问题是我不知道如何解码数组每个元素中的 8 字节整数。我有相同的十六进制编码格式的数据,例如:

08 00 00 00 03 *signals array length 3*
00 01 30 00 00 00 00 00 00 00 00 00 *signals integer*
00 01 31 00 00 00 00 00 00 00 00 00 *signals integer*
00 01 32 00 40 3C 00 00 00 00 00 00 *signals integer*
00 00 09 *signals object end*

这应该被解码为 [0, 0, 28](如果 minerva 可信)。
我一直在尝试使用 struct.unpack,但我看到的所有示例都是针对 4 字节(小端)值的。

要解码浮点数,请使用结构模块:

>>> struct.unpack('>d','403C000000000000'.decode('hex'))[0]
28.0

您要查找的格式说明符是 ">9xd4xd4xd3x":

>>> import struct
>>> from binascii import unhexlify
>>> struct.unpack(">9xd4xd4xd3x", unhexlify("080000000300013000000000000000000000013100000000000000000000013200403C000000000000000009"))
(0.0, 0.0, 28.0)

细分:

  1. >: 大端格式
  2. 5x:5 字节数组开始标记 + 大小(忽略)
  3. 4x: 4 字节元素开始标记(忽略)
  4. d:1 个大端 IEEE-754 double
  5. 其他2个元素2-3分
  6. 3x: 3 字节数组结束标记(忽略)

点 1. 和点 2. 合并为 9x.

您可能已经注意到,struct 只能忽略额外的字节,不能进行验证。如果您需要更灵活的输入格式,您可以在非贪婪模式下使用匹配 begin/end 数组标记的正则表达式。