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



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

我正在处理的新指令没有按预期工作,所以我试图在连接后和执行之前打印出指令,看看出了什么问题。

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

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

msg = 'xc2%s%s' % ('x1bx72, '07')

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

谢谢!

字符'x63''c'是相同的字符(以及其他六种拼写方式)。字母c对Python来说没有任何特别的意义。

c之前的角色'x1b'是逃脱。这对 Python 来说也没有什么特别的意义——但它可能对你的终端有意义。大多数终端使用以 Escape 开头并以字母结尾的"转义序列"来执行向上滚动、更改主文本颜色或清除屏幕等操作。

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

>>> msg = b'x1bx63'
>>> msg
b'x1bc'
>>> print(repr(msg))
b'x1bc'

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

>>> msg = 'x1bx63'
>>> msg
'x1bc'
>>> print(repr(msg))
'x1bc'

如果你使用的是Python 2.x,你将有u前缀,而不是Unicode上的前缀,没有前缀而不是字节上的前缀b,但基本相同。

相关内容

最新更新