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

时间:2015-06-13 21:42:54

标签: python double amf

我正在解码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字节(小端)值。

2 个答案:

答案 0 :(得分:1)

要解码浮点数,请使用struct-module:

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

答案 1 :(得分:1)

您要查找的格式说明符是">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个字节的数组结束标记(忽略)
  7. 要点1.和2.合并为9x

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