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

Attempting to debug hex instruction, but python clears my console?

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

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

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”,它会留下一个空行。

谢谢!

字符 '\x63''c' 相同(还有 half-dozen 其他拼写方式)。字母 c 对 Python 没有任何特殊意义。

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

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

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

请注意,无论哪种方式,它都包含 b 和引号,并且 hex-escapes 所有 non-printable 字节。它与 Unicode 字符串而不是字节字符串基本相同:

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

如果您使用 Python 2.x,您将在 Unicode 上使用 u 前缀而不是 none,并且没有前缀而不是 b字节数上,但基本相同。