将两个十六进制字符串转换为C中的双精度浮点数
我开始学习Python的第一天。
我想对一个由C语言生成的跟踪文件进行筛选。
在这个文件中,C语言中的每个双精度浮点数(double)都是用两个十六进制字符串来表示的,这两个字符串代表了这个双精度数的64位中的32位。
比如说,1234567890.3(C语言中的双精度浮点数)
在文件中的表现形式是:
0xb4933333
0x41d26580
我该怎么解析这些内容,并把它们组合起来,以便在Python中使用浮点数(float)呢?
提前谢谢你!
2 个回答
0
这里是关于浮点数的IEEE标准以及它是如何制定的:
9
你可以使用 struct
,并用 'd' 来表示 'double' 类型:
>>> import struct
>>> num1 = '0xb4933333'
>>> num2 = '0x41d26580'
>>> struct.unpack('!d', (num2[2:]+num1[2:]).decode('hex'))[0]
1234567890.3
要注意你添加 double 的顺序,上面的代码是基于大端字节序的机器。此外,我去掉了 0x
,因为 decode
函数不需要这个前缀。
补充一下:如果你使用的是 Python 3,你需要用 bytes.fromhex
来代替 ''.decode('hex')
。
这里提供一个替代方案(上面的方案已经很好了):
>>> import struct
>>> num1 = '0xb4933333'
>>> num2 = '0x41d26580'
>>> low_word = int(num1, 16)
>>> high_word = int(num2, 16)
>>> representation = struct.pack('>II', high_word, low_word)
>>> result = struct.unpack('>d', representation)
>>> result[0]
1234567890.3