2013-02-23 74 views
1

我很新的十六進制一般,我有一個應用程序,需要我分裂一個十六進制數字。例如,給定數字0x607F,我需要返回高(0x60)或低(0x7F)字節。在python中分割十六進制的最佳方法是什麼?

這是可能的實施,但它感覺有點不可思議。有沒有更多的標準方式來做到這一點在Python中?

def byte(integer,highlow): 
    assert highlow=='high' or highlow=='low' 
    if highlow=='high': 
     return hex(int(bin(integer)[:-8],2)) 
    if highlow=='low': 
     return hex(int(bin(integer)[-8:],2)) 

回答

11

這將返回高字節,低字節爲一個元組:

def bytes(integer): 
    return divmod(integer, 0x100) 

例如:

>>> high, low = bytes(0x607F) 
>>> hex(high) 
'0x60' 
>>> hex(low) 
'0x7f' 

順便說一句,這取決於您所需要的字節數,並在整數來自於,可能有更好的方法來做你需要的。

+0

剛剛在我的機器上發現了unutbu的答案...... 1.8us vs 2.22us。 FWIW我的代碼是在4.97us進來,只計算一個。 – Chris 2013-02-23 03:26:15

4
def bytes(num): 
    return hex(num >> 8), hex(num & 0xFF) 

bytes(0x607F) 

產生

('0x60', '0x7f') 
0

要添加到斯內德的答案是十分正確的,struct是提取字節的有力工具。

>>> import struct 
>>> print("0x%2x 0x%2x\n" % tuple(struct.pack('<H',0x4355))) 
0x55 0x43 

在此示例中,「<」告訴包解釋輸入作爲little-endian,以及「H」表示期望的2字節數。 Struct會生成一個字節對象(在Python 3上),然後可以將其轉換爲元組以滿足%x的字符串格式參數以打印出十六進制。

Python 2.7版要稍微麻煩,只是因爲struct.pack放在一個字符串中的信息必須是split into its characters

>>> print("0x%2x 0x%2x\n" % tuple([ ord(x) for x in struct.pack('<H',0x4355)])) 
0x55 0x43 

如果你真的做的這個例子一樣簡單的東西,它可能矯枉過正。如果您操縱更多數值或不同長度的數字(例如,從微控制器觀察到的寄存器或使用C或C++交換數據),請考慮使用struct來更容易地處理字節。

相關問題