2014-03-06 123 views
4

我需要取整數(例如-200)並將其更改爲十六進制(FF 38),然後將其轉換爲通過串行發送的整數0-255。我給出的例子是:使用Python將整數轉換爲雙字節十六進制

-200 = hex FF38 = [hex FF] [hex 38] = [255] [56] 

我一直在使用struct.pack('>h', -200)嘗試,但返回的值不正確。我也試過hex(),但是它返回了一個不正確的負十六進制值。

我不知道還有什麼我應該嘗試。

+0

你需要發送一個十進制整數'b'255''(三個字節)或只是一個字節:'b'\ xff''(單個字節)? – jfs

回答

3
>>> hex(struct.unpack('>H', struct.pack('>h', -200))[0]) 
'0xff38' 

首先,你包-200作爲簽署2個字節的短整型。然後,您將該數據解壓縮爲無符號2字節短int。這給你65336,其中hexff38


如果您需要發送0-255整數,這可能會更好地工作:當你拆開成兩個無符號的字符

>>> struct.unpack('>BB', struct.pack('>h', -200)) 
(255, 56) 
>>> struct.unpack('>BB', struct.pack('>h', 200)) 
(0, 200) 


需要documentationstruct

+0

這對於正數很適用,但負數呢?我嘗試了200和-200並得到了同樣的結果。 –

+0

你應該沒有...我已經編輯了我的答案,每個例子 – mhlester

+0

如果包裝未經簽名,它會引發一個異常:'struct.error:'H'格式代碼的整數超出範圍 – mhlester

0

兩個碼算術運算和一些字符串切片:

hex(200 - (1 << 16)) #2 bytes -> 16 bits 
Out[26]: '-0xff38' 

int(hex(200 - (1 << 16))[-4:-2], 16) 
Out[28]: 255 

int(hex(200 - (1 << 16))[-2:], 16) 
Out[29]: 56 

請注意,你必須注意正確處理非負數(即不採取補),當長度由hex返回的字符串長度各不相同。

相關問題