Python中的二进制到十六进制,低半字节第一次编码

时间:2016-10-04 07:15:03

标签: python encoding hex binary-data packing

我有一个协议,需要将二进制数据转换为十六进制编码的字符串,其中低半字节(每个字节的低4位)首先出现 - 例如Python字符串' \ xab \ xcd& #39;将被编码为' badc'。这种奇怪的格式来自具有pack格式的PHP / Perl unpackh*函数(请参阅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))

这似乎在我的案例中运作良好,但我想知道是否有人可以建议更正式的方法。

1 个答案:

答案 0 :(得分:0)

更有效的方法是预先计算翻译表,然后使用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