代码之家  ›  专栏  ›  技术社区  ›  Chris

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

  •  3
  • Chris  · 技术社区  · 13 年前

    一般来说,我对十六进制还很陌生,而且我有一个应用程序需要我拆分十六进制数。例如,给定数字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 回复  |  直到 5 年前
        1
  •  15
  •   Ned Batchelder    13 年前

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

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

    例如:

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

    顺便说一句,根据你需要字节做什么,以及整数来自哪里,可能有更好的方法来做你需要的事情。

        2
  •  6
  •   unutbu    13 年前
    def bytes(num):
        return hex(num >> 8), hex(num & 0xFF)
    
    bytes(0x607F)
    

    产量

    ('0x60', '0x7f')
    
        3
  •  2
  •   Community Mohan Dere    9 年前

    再加上Ned的回答是非常正确的, 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来更容易地处理字节。