在python中拆分十六进制的最佳方法?

时间:2013-02-23 03:00:59

标签: python hex

我对一般的十六进制很新,我有一个应用程序需要我分割十六进制数。例如,给定数字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))

3 个答案:

答案 0 :(得分:14)

这会将高字节和低字节作为元组返回:

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

例如:

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

BTW,根据您需要的字节数以及整数来自哪里,可能有更好的方法来满足您的需求。

答案 1 :(得分:5)

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

bytes(0x607F)

产量

('0x60', '0x7f')

答案 2 :(得分:0)

为了添加Ned的答案非常正确,struct是一个提取字节的强大工具。

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

在这个例子中,“&lt;”告诉pack将输入解释为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来更容易地纠缠字节。