Python 从C双精度转换为两个十六进制字符串

Python 从C双精度转换为两个十六进制字符串,python,string,floating-point,hex,double,Python,String,Floating Point,Hex,Double,我学习Python的第一天 我喜欢过滤C生成的跟踪文件。 C中的每个double在文件中的格式为 两个十六进制字符串,表示64双精度中的32位 e、 g.1234567890.3(C双) 内部文件: 0xb4933333 0x41d26580 如何解析和组合它以进一步使用Python浮点 提前感谢您可以使用struct,使用'double'的'd'修饰符: >>> import struct >>> num1 = '0xb4933333' >>&

我学习Python的第一天

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

e、 g.1234567890.3(C双)
内部文件:

0xb4933333
0x41d26580
如何解析和组合它以进一步使用Python浮点


提前感谢

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

>>> import struct
>>> num1 = '0xb4933333'
>>> num2 = '0x41d26580'
>>> struct.unpack('!d', (num2[2:]+num1[2:]).decode('hex'))[0]
1234567890.3
请注意将double添加到哪个顺序中,上面的假设是一个big-endian机器。另外,我剥离了
0x
,因为
decode
函数并不期望它

编辑:如果您使用的是Python 3,则需要使用
bytes.fromhex
而不是
'.decode('hex')


仅给出一个替代方案(以上是一个非常好的解决方案):


以下是IEEE浮点数标准及其创建方法:


+1提醒OP注意endianness,肯定有东西会绊倒一个人。int('0xff',16)起作用,看起来更干净,imho。此外,它还可以更可靠地处理一些错误(例如,输入中省略了“0x”)。使用
int()
可以让他到这里来做什么?他正在寻找一个8字节字符串的双重表示。想和大家分享一个例子吗?我同意当你寻找整数表示时,
int()
更简洁,但他希望附加两个bytestring,并采用它的双重表示。另外:机器知道它的endianess。他应该担心的是文件的结尾是给big endian的,不是吗?
>>> 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