创建列表值的十六进制转储

时间:2020-09-24 06:31:27

标签: python python-3.x

我编写了一个模块,用于显示来自通信线路的数据。它应以十六进制转储形式显示传输的数据。

如何将列表a=[0x41,0x42,0x43,0x0D]转换为十六进制转储,如

41 42 43 0D      ABC.

请注意,不可打印字符用点代替。

我用''.join(map(chr,a))尝试过。这在Python Shell中显示为“ ABC \ n”,但仍包含换行符。

以另一种方法,我想显示列表,使其与输出的Python Shell中显示的完全相同。即换行符应显示为“ \ n”,而不是下一行。如何用\n替换\\n并用点替换任何其他不可打印的字符?

2 个答案:

答案 0 :(得分:5)

我假设您要将控制字符转换为点(ASCII码低于32的点)。

我还将假定字符渲染(第二部分)应以固定的偏移量开始,以便在数据变得太宽时需要将数据分成多行。

代码:

def hexdump(data):
    return "\n".join(
        " ".join(["{:02X}".format(n) for n in chunk]).ljust(49) + 
        "".join([chr(n) if chr(n).isprintable() else "." for n in chunk])
        for chunk in [data[i:i+16] for i in range(0, len(data), 16)]
    )

示例运行:

a=[0x41,0x42,0x43,0x41,0x42,0x43,0x41,0x42,0x43,0x41,0x42,0x43,0x41,0x42,0x43,0x41,0x42,0x43
,0x41,0x42,0x43,0x41,0x42,0x43,0x41,0x42,0x43,0x41,0x42,0x43,0x41,0x42,0x43,0x0D]
print(hexdump(a))

输出:

41 42 43 41 42 43 41 42 43 41 42 43 41 42 43 41  ABCABCABCABCABCA
42 43 41 42 43 41 42 43 41 42 43 41 42 43 41 42  BCABCABCABCABCAB
43 0D                                            C.

转义控制字符

在问题结尾处询问的替代方法可以通过正则表达式或translate实现:

trans = str.maketrans({ 
    i: "\\" + ("x{:02x}".format(i) if i < 7 or i > 13  
              else "abtnvfr"[i-7]) 
    for i in range(32)
})

s = "first line\nsecond line\r\ncol1\tcol2\nspecial \x1f"
print(s)
print(s.translate(trans))

如果存在这样的助记符,它将使用\x01表示法或\n\r等逃逸控制字符(在ASCII范围0到31之间)。

答案 1 :(得分:0)

使用字符串格式:

>>> ' '.join(['{:02X}'.format(h) for h in a])
'41 42 43 0D'

文档可在PEP3101中找到:https://www.python.org/dev/peps/pep-3101/#standard-format-specifiers