Python中将十六进制转换为有符号十进制
我有一个包含十六进制数据的文件,我想用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
。