2013-02-23 80 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来更容易地处理字节。

相关问题