我正在解码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字节(小端)值。
答案 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)
细分:
>
:大端格式5x
:5个字节的数组开始标记+大小(忽略)4x
:4个字节的元素开头标记(忽略)d
:1大尾数IEEE-754 double
3x
:3个字节的数组结束标记(忽略)要点1.和2.合并为9x
。
您可能已经注意到,struct
只能忽略额外的字节,而不是验证。如果输入格式需要更大的灵活性,可以在非贪婪模式下使用匹配开始/结束数组标记的正则表达式。