将16位十六进制字符串转换为Python 3中的双精度值

问题描述 投票:0回答:1

我想将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,)]

python-3.x hex
1个回答
0
投票

您的原始号码是-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')]]

  • 我将使用最后一个,替换格式字符串。

© www.soinside.com 2019 - 2024. All rights reserved.