从两个十六进制字符串传输的C double转换

时间:2011-07-15 21:52:38

标签: python string floating-point hex double

我在Python的第一天。

我喜欢过滤C生成的跟踪文件。 C中的每个双精度格式都在文件中 两个十六进制字符串代表64位双精度的32位。

e.g。 1234567890.3(C double)
内部文件:

0xb4933333
0x41d26580

如何解析并组合它以进一步使用Python float?

提前致谢

2 个答案:

答案 0 :(得分:9)

您可以使用struct,使用'd'修饰符代替'double':

>>> import struct
>>> num1 = '0xb4933333'
>>> num2 = '0x41d26580'
>>> struct.unpack('!d', (num2[2:]+num1[2:]).decode('hex'))[0]
1234567890.3

要小心你追加双打的顺序,上面假设是一个大端机器。另外,我剥离了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

答案 1 :(得分:0)

以下是浮点的IEEE标准及其创建方式:

http://www.psc.edu/general/software/packages/ieee/ieee.php