我有一個HEX數據文件,我想用Python將它轉換爲SIGNED DECIMAL。 int('0xffd2',16)
不是解決方案,因爲它將HEX轉換爲無符號的DEC。任何想法如何做到這一點?從十六進制轉換爲Python中的帶符號DEC
0xffd2, 65490
0xffcb, 65483
0xffcb, 65483
0xffcc, 65484
0x10, 16
0xc, 12
0xd, 13
0x0, 0
0xfffe, 65534
我有一個HEX數據文件,我想用Python將它轉換爲SIGNED DECIMAL。 int('0xffd2',16)
不是解決方案,因爲它將HEX轉換爲無符號的DEC。任何想法如何做到這一點?從十六進制轉換爲Python中的帶符號DEC
0xffd2, 65490
0xffcb, 65483
0xffcb, 65483
0xffcc, 65484
0x10, 16
0xc, 12
0xd, 13
0x0, 0
0xfffe, 65534
一旦你有了無符號的值,就很容易轉換爲signed。
if value >= 0x8000:
value -= 0x10000
這是一個16位數字。對於一個32位數字,只需爲每個魔術常量添加4個零。那些常數也可以計算爲1 << (bits - 1)
和1 << bits
。
您可以使用按位運算將字節解釋爲二進制補碼有符號整數。例如,對於一個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
)。
給出一個將編碼爲負數的十六進制字符串的示例。 –
0xffe5 ===> -27/val2 ='perl -e「print unpack('s',pack's',hex('0xffe5'))」'/ echo $ val2 – Dody