在 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 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

在 Swift 中将有符号转换为无符号

在python中将double(float)转换为字节

如何在python中将负整数值转换为十六进制

为啥有符号负数转换为无符号数?

在 C 中从浮点数转换为无符号字符

如何将以“\ 0”开头的char *转换为无符号整数? [关闭]