在Python中从HEX转换为SIGNED DEC

时间:2014-07-03 21:48:39

标签: python

我有一个带有HEX数据的文件我希望使用python将其转换为SIGNED DECIMAL。 int('0xffd2',16)不是解决方案,因为它将HEX转换为无符号DEC。知道怎么做吗?

0xffd2, 65490

0xffcb, 65483

0xffcb, 65483

0xffcc, 65484

0x10, 16

0xc, 12

0xd, 13

0x0, 0

0xfffe, 65534

2 个答案:

答案 0 :(得分:8)

您可以使用按位运算将字节解释为2的补码有符号整数。例如,对于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),第二个掩码匹配所有剩余位({{1} })。

答案 1 :(得分:3)

获得无符号值后,很容易转换为signed。

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

这是一个16位数字。对于32位数字,只需为每个魔术常数添加4个零。这些常量也可以计算为1 << (bits - 1)1 << bits