【问题标题】:Binary to hex in Python, low-nibble first encodingPython中的二进制到十六进制,低半字节优先编码
【发布时间】:2016-10-04 07:15:03
【问题描述】:

我有一个协议,该协议需要将二进制数据与十六进制编码字符串相互转换,其中低半字节(每个字节的低 4 位)首先出现 - 例如 Python 字符串 '\xab\xcd' 将是编码为“badc”。这种奇怪的格式来自 PHP/Perl 的 packunpack 函数以及 h* 格式(参见 http://php.net/manual/en/function.pack.php)。

显然binascii.hexlify() 等人无法做到这一点。我尝试使用struct 模块以及array byteswapping as suggested here 的各种格式,但无法使其正常工作。

我最终通过一些老式的杂耍来解决它:

def to_low_nibble_hex(value):
    """Convert a binary string to hex using low-nibble first encoding
    """
    r = []
    for c in value:
        c = ord(c)
        hb = (0x0f & c) << 4
        lb = (0xf0 & c) >> 4
        nc = chr(hb | lb)
        r += [nc]
    return binascii.hexlify(''.join(r))

这在我的情况下似乎效果很好,但我想知道是否有人可以提出更正式的方法。

【问题讨论】:

    标签: python encoding hex binary-data packing


    【解决方案1】:

    更有效的方法是预先计算转换表,然后使用 str.translate() 简单地应用它

    _translation = bytearray(((0x0f & c) << 4 | (0xf0 & c) >> 4)
                             for c in range(256))
    
    def to_low_nibble_hex(value):
        return binascii.hexlify(value.translate(_translation))
    

    这也适用于 python3 而无需修改,尽管您可以将 bytearray 替换为 bytes

    【讨论】:

    • 这确实看起来干净高效,我可能会采用它,所以谢谢!但是我仍然想知道是否有更标准的解决方案。
    猜你喜欢
    • 2023-03-14
    • 1970-01-01
    • 2016-04-17
    • 2017-11-11
    • 2017-09-13
    • 2014-02-13
    • 2015-08-08
    • 2014-12-25
    • 1970-01-01
    相关资源
    最近更新 更多