拆分十六进制的最佳方式



我对十六进制很陌生,我有一个应用程序需要我拆分一个十六进制数。例如,给定数字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来更容易地处理字节。

最新更新