2014-07-03 91 views
2

我有一個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 
+1

給出一個將編碼爲負數的十六進制字符串的示例。 –

+0

0xffe5 ===> -27/val2 ='perl -e「print unpack('s',pack's',hex('0xffe5'))」'/ echo $ val2 – Dody

回答

3

一旦你有了無符號的值,就很容易轉換爲signed。

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

這是一個16位數字。對於一個32位數字,只需爲每個魔術常量添加4個零。那些常數也可以計算爲1 << (bits - 1)1 << bits

3

您可以使用按位運算將字節解釋爲二進制補碼有符號整數。例如,對於一個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)。

相關問題