在python中将HEX转换为无符号INT16

时间:2018-12-08 08:02:57

标签: python python-3.x hex

我已经苦苦挣扎了一段时间,却找不到正确的方法来做。 我有十六进制

8a:01

这是未签名的INT16

394

如何在python 3.X中做到这一点?

预先感谢

1 个答案:

答案 0 :(得分:0)

您可以使用标准库中的binasciistruct模块进行转换:

>>> import binascii
>>> import struct
>>> import sys

# Check our system's byte order
>>> sys.byteorder
'little'
>>> hx = '8a01'
# convert hex to bytes
>>> bs = binascii.unhexlify(hx)
>>> bs
b'\x8a\x01'
# struct module expects ints to be four bytes long, so pad to make up the length
>>> padded = bs + b'\x00\x00'
# Ask struct to unpack a little-endian unsigned int.
>>> i = struct.unpack('<I', padded)
>>> i
(394,)

更新

该问题已重复存在。重复的解决方案无法产生所需的结果:

>>> int('8a01', 16)
35329

但是,如果字节顺序相反,它将按预期工作:

>>> int('018a', 16)
394

这是因为内置int函数假定十六进制字符串的排序方式与我们在纸上以10为基数的排序方式相同,即最左边的值是最高有效的。初始值0x8a01的左侧最低有效值,因此使用int从基数16转换会产生错误的结果。

但是,在Python3中,我们仍然可以使用int.from_bytes使用int来产生一个更简单的解决方案。

>>> hx = '8a01'
>>> bs = binascii.unhexlify(hx)
>>> bs
b'\x8a\x01'
>>> int.from_bytes(bs, byteorder=sys.byteorder)
394