将两个十六进制字符串转换为C中的双精度浮点数

8 投票
2 回答
510 浏览
提问于 2025-04-16 21:38

我开始学习Python的第一天。

我想对一个由C语言生成的跟踪文件进行筛选。

在这个文件中,C语言中的每个双精度浮点数(double)都是用两个十六进制字符串来表示的,这两个字符串代表了这个双精度数的64位中的32位。

比如说,1234567890.3(C语言中的双精度浮点数)
在文件中的表现形式是:

0xb4933333
0x41d26580

我该怎么解析这些内容,并把它们组合起来,以便在Python中使用浮点数(float)呢?

提前谢谢你!

2 个回答

0

这里是关于浮点数的IEEE标准以及它是如何制定的:

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

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

撰写回答