3

一般来说,我对十六进制很陌生,而且我有一个需要我拆分十六进制数字的应用程序。例如,给定数字 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))
4

3 回答 3

15

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

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

例如:

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

顺便说一句,根据您需要字节的用途以及整数的来源,可能会有更好的方法来满足您的需求。

于 2013-02-23T03:03:49.817 回答
6
def bytes(num):
    return hex(num >> 8), hex(num & 0xFF)

bytes(0x607F)

产量

('0x60', '0x7f')
于 2013-02-23T03:14:05.573 回答
2

为了补充 Ned 非常正确的答案,struct是提取字节的强大工具。

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

在这个例子中,“<”告诉 pack 将输入解释为little-endian,而“H”表示期望一个 2 字节的数字。Struct 生成一个字节对象(在 Python 3 上),然后可以将其转换为元组以满足 %x 的字符串格式参数以打印出十六进制。

Python 2.7 稍微麻烦一些,只是因为 struct.pack 将信息放在一个字符串中,该字符串必须拆分成字符

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

如果你真的做像这个例子一样简单的事情,那可能是矫枉过正。如果您要处理更多值或不同长度的数字,例如,从微控制器观察到的寄存器,或者与 C 或 C++ 交换数据,请考虑使用 struct 以更容易地处理字节。

于 2016-04-20T00:06:42.100 回答