我编写了一个模块,用于显示来自通信线路的数据。它应以十六进制转储形式显示传输的数据。
如何将列表a=[0x41,0x42,0x43,0x0D]
转换为十六进制转储,如
41 42 43 0D ABC.
请注意,不可打印字符用点代替。
我用''.join(map(chr,a))
尝试过。这在Python Shell中显示为“ ABC \ n”,但仍包含换行符。
以另一种方法,我想显示列表,使其与输出的Python Shell中显示的完全相同。即换行符应显示为“ \ n”,而不是下一行。如何用\n
替换\\n
并用点替换任何其他不可打印的字符?
答案 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