我正在尝试使用 PuTTY 通过串行 COM 端口发送特定的十六进制值。具体来说,我想发送十六进制代码 9C、B6、FC 和 8B。我查了一下这些Alt代码,它们分别是 156、182、252 和 139。
但是,每当我输入Alt代码时,在 9C、B6 和 8B 之前都会发送一个十六进制值 C2,因此发送的值是 C2 9C、C2 B6 和 C2 8B。FC 的值更改为 C3 FC。
为什么这些值要放在十六进制值之前,为什么 FC 会被完全改变?对我来说,将代码转换为十六进制似乎存在内部问题Alt。有没有办法Alt在 PuTTY 中直接输入十六进制值而不使用代码?
答案1
您所看到的只是普通的文本字符集转换。
就 PuTTY 而言,您正在输入(和阅读)文本,而不是原始二进制数据,因此在通过网络发送文本之前,它必须将文本转换为任何配置的字符集中的字节。
换句话说,当你输入Alt+时1 8 2,PuTTY 会收到相应的特点来自系统配置的旧式“OEM”字符集。(键入Alt+0 1 8 2将从旧式“ANSI”(Windows-125x)字符集中进行选择。)在本例中,字符是¶
,即段落标记。
现在 PuTTY 必须将该字符转换为字节。早期版本的 PuTTY 默认会选择与操作系统本身相同的旧版 Windows-125x 字符集,例如 Windows-1257,因此转换几乎是直接的 - 输入1 8 2,接收十进制字节 182(十六进制 0xB6)。
然而,由于 PuTTY 通常连接到 Linux 或 BSD 服务器,而这些服务器绝大多数已迁移到UTF-8作为默认设置,最新的 PuTTY 版本也开始默认使用 UTF-8。UTF-8 是 Unicode 超级字符集的编码,位于¶
U+00B6 位置,并且大多只是巧合UTF-8 将该值编码为字节C2 B6
:
U+00B6
→0000|0000 10|110110
→[110]00010 [10]110110
→C2 B6
U+00FC
→0000|0000 11|111100
→[110]00011 [10]111100
→C3 BC
U+20AC
→0010|0000 10|101100
→[1110]0010 [10]000010 [10]101100
→E2 82 AC
维基百科上有颜色
举个不同的例子,字母在 Windows-1257 字符ė
集中是字节E6
,但在 Unicode 中是 U+0117,对应于C4 97
UTF-8 中的字节。这些序列的长度可变,对于较大的位置,最多为 4 个字节。
如果您必须使用 PuTTY 发送二进制数据,请打开“窗口 → 翻译”设置屏幕,并选择 CP437、ISO-8859-1 或 Windows-1252 作为“远程字符集”。(将其保存在单独的会话中;不是将其保存为全局默认值,因为它将破坏常规 SSH 连接。)