我已经苦苦挣扎了一段时间,却找不到正确的方法来做。 我有十六进制
8a:01
这是未签名的INT16
394
如何在python 3.X中做到这一点?
预先感谢
答案 0 :(得分:0)
您可以使用标准库中的binascii和struct模块进行转换:
>>> 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