Python中将十六进制转换为有符号十进制

5 投票
2 回答
18185 浏览
提问于 2025-04-18 12:03

我有一个包含十六进制数据的文件,我想用Python把它转换成带符号的十进制数。int('0xffd2',16) 这个方法不行,因为它把十六进制转换成的是无符号的十进制。有没有什么好的办法可以做到这一点呢?

0xffd2, 65490

0xffcb, 65483

0xffcb, 65483

0xffcc, 65484

0x10, 16

0xc, 12

0xd, 13

0x0, 0

0xfffe, 65534

2 个回答

6

一旦你得到了无符号值,转换成有符号值就非常简单了。

if value >= 0x8000:
    value -= 0x10000

这里说的是16位的数字。如果是32位的数字,只需要在每个神奇常量后面加上4个零。这些常量也可以通过 1 << (位数 - 1)1 << 位数 来计算。

15

你可以通过位运算把字节当作一个带符号的整数来理解,尤其是用二的补码表示。举个例子,假设我们在处理一个16位的数字:

def s16(value):
    return -(value & 0x8000) | (value & 0x7fff)

因此:

>>> s16(int('0xffd2', 16))
-46
>>> s16(int('0xffcb', 16))
-53
>>> s16(int('0xffcc', 16))
-52
>>> s16(int('0x10', 16))
16
>>> s16(int('0xd', 16))
13
>>> s16(int('0x0', 16))
0
>>> s16(int('0xfffe', 16))
-2

这个方法可以扩展到任何位数的字符串,只需要设置掩码。第一个掩码用来匹配最高位(最左边的那一位),比如说 0x8000 == 1 << 15 == 0b1000000000000000,而第二个掩码则用来匹配剩下的所有位,像这样 0x7fff == (1 << 15) - 1 == 0b0111111111111111

撰写回答