【问题标题】:Best way to split a hexadecimal?拆分十六进制的最佳方法?
【发布时间】:2013-02-23 03:00:58
【问题描述】:

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

【问题讨论】:

    标签: python hex


    【解决方案1】:

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

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

    例如:

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

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

    【讨论】:

    • 刚刚在我的机器上勉强找到了 unutbu 的答案...... 1.8us vs 2.22us。 FWIW 我的代码在 4.97us 时输入,只计算一个。
    【解决方案2】:
    def bytes(num):
        return hex(num >> 8), hex(num & 0xFF)
    
    bytes(0x607F)
    

    产量

    ('0x60', '0x7f')
    

    【讨论】:

      【解决方案3】:

      补充一下 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 以更容易地处理字节。

      【讨论】:

        猜你喜欢
        • 2019-03-27
        • 2019-02-14
        • 1970-01-01
        • 2010-11-21
        • 1970-01-01
        • 2018-08-02
        • 1970-01-01
        • 1970-01-01
        • 2019-11-06
        相关资源
        最近更新 更多