在 python 中将 HEX 转换为无符号 INT16 [重复]
Posted
技术标签:
【中文标题】在 python 中将 HEX 转换为无符号 INT16 [重复]【英文标题】:Converting an HEX to unsigned INT16 in python [duplicate] 【发布时间】:2019-05-09 21:05:22 【问题描述】:我已经为此苦苦挣扎了一段时间,但找不到正确的方法。 我有一个十六进制
8a:01
这是无符号的 INT16
394
如何在 python 3.X 中做到这一点?
提前致谢
【问题讨论】:
这是一个 unsigned int16,这个线程中的解决方案不包括这种情况 【参考方案1】:您可以使用标准库中的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
来生成更简单的解决方案,使用 int.from_bytes
。
>>> hx = '8a01'
>>> bs = binascii.unhexlify(hx)
>>> bs
b'\x8a\x01'
>>> int.from_bytes(bs, byteorder=sys.byteorder)
394
【讨论】:
完美!我没有意识到我们可以像那样填充它! @deubNippon 我为您找到了一个稍微简单的解决方案 - 请参阅答案的更新。以上是关于在 python 中将 HEX 转换为无符号 INT16 [重复]的主要内容,如果未能解决你的问题,请参考以下文章