首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >创建列表值的十六进制转储

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

Stack Overflow用户
提问于 2020-09-24 14:31:27
回答 2查看 109关注 0票数 0

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

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

代码语言:javascript
复制
41 42 43 0D      ABC.

请注意,不可打印的字符将替换为点。

我在''.join(map(chr,a))上试过了。这在Python shell中显示为'ABC\n',但仍包括换行符。

在另一种方法中,我希望在输出中显示与Python shell中显示的列表完全相同的列表。即换行符应该显示为"\n“,而不是转到下一行。如何用\\n替换\n,并用点替换任何其他不可打印的字符?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-09-24 15:08:24

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

我还假设字符渲染(第二部分)应该从固定的偏移量开始,这样当数据变得太宽时,您需要将数据拆分到多行中。

代码:

代码语言:javascript
复制
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)]
    )

示例运行:

代码语言:javascript
复制
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))

输出:

代码语言:javascript
复制
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来实现

代码语言:javascript
复制
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内)。当它存在这样的助记符时。

票数 5
EN

Stack Overflow用户

发布于 2020-09-24 14:42:53

使用字符串格式:

代码语言:javascript
复制
>>> ' '.join(['{:02X}'.format(h) for h in a])
'41 42 43 0D'

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64040711

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档