我对十六进制很陌生,我有一个应用程序需要我拆分一个十六进制数。例如,给定数字0x607F,我需要返回高(0x60)或低(0x7F)字节。
这是可能的实现,不过感觉有点乏味。在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))
这将高字节和低字节作为元组返回:
def bytes(integer):
return divmod(integer, 0x100)
例如:
>>> high, low = bytes(0x607F)
>>> hex(high)
'0x60'
>>> hex(low)
'0x7f'
顺便说一句,根据字节的用途以及整数的来源,可能有更好的方法来满足您的需求。
def bytes(num):
return hex(num >> 8), hex(num & 0xFF)
bytes(0x607F)
产生
('0x60', '0x7f')
为了补充Ned的答案,struct是提取字节的强大工具。
>>> import struct
>>> print("0x%2x 0x%2xn" % tuple(struct.pack('<H',0x4355)))
0x55 0x43
在本例中,"<"告诉pack将输入解释为little-endian,而"H"表示期望2字节数。Struct生成一个字节对象(在Python3上),然后可以将其转换为元组,以满足字符串格式参数,从而使%x打印出十六进制。
Python2.7稍微麻烦一些,只是因为struct.pack将信息放在一个字符串中,该字符串必须拆分为以下字符:
>>> print("0x%2x 0x%2xn" % tuple([ ord(x) for x in struct.pack('<H',0x4355)]))
0x55 0x43
如果您真的正在做像本例这样简单的事情,那么这可能有些过头了。如果你正在操作更多的值或不同长度的数字,例如,从微控制器观察到的寄存器,或者与C或C++交换数据,可以考虑使用struct来更容易地处理字节。