我有一个协议,需要将二进制数据转换为十六进制编码的字符串,其中低半字节(每个字节的低4位)首先出现 - 例如Python字符串' \ xab \ xcd& #39;将被编码为' badc'。这种奇怪的格式来自具有pack
格式的PHP / Perl unpack
和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))
这似乎在我的案例中运作良好,但我想知道是否有人可以建议更正式的方法。
答案 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