我想将16位十六进制数字转换为双精度。实际上,在此之前我做了相反的工作:
import struct
import wrap
def double_to_hex(doublein):
return hex(struct.unpack('<Q', struct.pack('<d', doublein))[0])
for i in modified_list:
encoded_list.append(double_to_hex(i))
modified_list.clear()
encoded_msg = ''.join(encoded_list).replace('0x', '')
encoded_list.clear()
print_command('encode', encoded_message)
现在我想做相反的事情。我没有成功尝试过:
from textwrap import wrap
import struct
import binascii
MESSAGE = 'c030a85d52ae57eac0129263c4fffc34'
#Splitting up message into n 16-bit strings
MSGLIST = wrap(MESSAGE, 16)
doubles = []
print(MSGLIST)
for msg in MSGLIST:
doubles.append(struct.unpack('d', binascii.unhexlify(msg)))
print(doubles)
但是,当我运行此命令时,我会得到疯狂的价值观,这当然不是我所输入的:[(-1.8561629252326087e+204,), (1.8922789420412524e-53,)]
您的原始号码是-16.657673995556173和-4.642958715557189吗?
[如果是这样,那么问题在于您的十六进制字符串包含double的big-endian(最高有效字节在前)表示,但是'd'
调用中的unpack
格式字符串指定使用系统的本机格式进行转换,碰巧是小尾数(最低有效字节在前)。结果是unpack
从错误的一端读取并处理了unhexlify
字符串的字节。毫不奇怪,这将产生错误的值。
要解决,请执行以下一项操作:
在将十六进制字符串传递给c030a85d52ae57ea
之前,将其转换为低位字节序格式(反转字节,因此ea57ae525da830c0
变为binascii.unhexlify
),或者
在将它们传递给unhexlify
之前将binascii.unhexlify(msg)
产生的字节反转(将binascii.unhexlify(msg)[::-1]
更改为unpack
),或者
告诉unpack
使用大端顺序进行转换(将格式字符串'd'
替换为'>d'
)]]
我将使用最后一个,替换格式字符串。