试图调试十六进制指令,但python清除了我的控制台?

2024-09-29 03:28:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在编写一个驱动程序,并根据一些条件连接一些十六进制指令。到目前为止,所有指令都按预期工作

我正在处理的一条新指令没有按预期工作,因此我尝试在连接之后和执行之前打印出该指令,以查看错误

msg = '\xc2%s%s' % ('\x1b\x63', '07')
assert self.dev.ctrl_transfer(0x21, 9, 0x0300, 0, msg) == len(msg)
print(msg)

当我在连接后打印它时,它清除控制台并打印'07',然后继续执行驱动程序的其余部分。我可以打印并执行我连接的其他所有指令,比如下面的指令,而不会出现问题

msg = '\xc2%s%s' % ('\x1b\x72, '07')

有人知道为什么会这样吗?“\x63”字节是否告诉python做一些我不知道的事情?它应该连接到指令的其余部分,后跟“\x07”字节。请注意,如果在'07'之前包含'\x'(与上面的代码不同),它仍然执行相同的操作,只是不打印'07',而是留下一个空行

谢谢


Tags: devselflen字节错误指令驱动程序msg
1条回答
网友
1楼 · 发布于 2024-09-29 03:28:33

字符'\x63''c'是同一个字符(还有六种其他拼写方法)。字母c对Python没有任何特殊的含义

c前面的字符'\x1b'是Escape。这对Python也没有什么特别的意义,但对您的终端来说可能是这样。大多数终端使用“转义序列”,以转义开始,以字母结束,这样可以向上滚动、更改主文本颜色或清除屏幕

如果这妨碍了交互式调试会话,您可能需要考虑打印字符串的repr,而不是字符串本身。最简单的方法是不使用print

>>> msg = b'\x1b\x63'
>>> msg
b'\x1bc'
>>> print(repr(msg))
b'\x1bc'

请注意,无论哪种方式,它都包含b和引号,并且十六进制转义所有不可打印的字节。它的工作原理与Unicode字符串基本相同,而不是字节字符串:

>>> msg = '\x1b\x63'
>>> msg
'\x1bc'
>>> print(repr(msg))
'\x1bc'

如果您使用的是Python2.x,Unicode上的前缀是u,而不是无前缀,字节上的前缀是b,但基本相同

相关问题 更多 >