我有一个带有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
答案 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
。