我编写了一个显示来自通信线路的数据的模块。它将以十六进制转储的形式显示传输的数据。
如何将列表a=[0x41,0x42,0x43,0x0D]转换为十六进制转储
41 42 43 0D ABC.请注意,不可打印的字符将替换为点。
我在''.join(map(chr,a))上试过了。这在Python shell中显示为'ABC\n',但仍包括换行符。
在另一种方法中,我希望在输出中显示与Python shell中显示的列表完全相同的列表。即换行符应该显示为"\n“,而不是转到下一行。如何用\\n替换\n,并用点替换任何其他不可打印的字符?
发布于 2020-09-24 15:08:24
我将假设您想要将控制字符转换为点(那些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内)。当它存在这样的助记符时。
发布于 2020-09-24 14:42:53
使用字符串格式:
>>> ' '.join(['{:02X}'.format(h) for h in a])
'41 42 43 0D'文档可在PEP3101:https://www.python.org/dev/peps/pep-3101/#standard-format-specifiers中找到
https://stackoverflow.com/questions/64040711
复制相似问题