DECRQCRA / DECCKSR —— 请求矩形区域校验和(`CSI Pi;Pg;Pt;Pl;Pb;Pr*y`)
请终端对矩形区域的单元算 16 位校验和(`CSI Pi;Pg;Pt;Pl;Pb;Pr*y`),DCS DECCKSR 回(`\x1bP<Pi>!~<hex4>\x1b\\`)。xterm vttest / ConPTY 一致性测试用作金标。
字节形式
涵盖所有常见的字符串字面量写法,方便正反查找。
\x1b[Pi;Pg;Pt;Pl;Pb;Pr*y reply \x1bP<Pi>!~<hex4>\x1b\\\033[Pi;Pg;Pt;Pl;Pb;Pr*y reply \033P<Pi>!~<hex4>\033\\\e[Pi;Pg;Pt;Pl;Pb;Pr*y reply \eP<Pi>!~<hex4>\e\\ESC [ <Pi> ; <Pg> ; <Pt> ; <Pl> ; <Pb> ; <Pr> * y reply: ESC P <Pi> ! ~ <hex4> ESC \\1b 5b … 2a 79 reply: 1b 50 … 21 7e <hex4> 1b 5c说明
**DECRQCRA**(*请求矩形区域校验和*,`\x1b[<Pi>;<Pg>;<Pt>;<Pl>;<Pb>;<Pr>*y`)让终端对边框矩形内每个单元的字符 + 属性算一个 16 位校验和,以 4 位大写十六进制装进 DCS **DECCKSR** 帧回送:`\x1bP<Pi>!~<HHHH>\x1b\\`。 这是 **xterm vttest** 的一致性金标 —— 每个绘屏特性(DECCRA、DECFRA、DECERA、ED、EL、滚屏、行回绕、SGR 笔状态承接、alt-screen 切换)都靠「绘屏 → DECRQCRA → 断言校验和等于记录的金值」来验证。Konsole 的 `tests/vt-tests`、mlterm 的回归集、PowerShell ConPTY 的 TerminalEcho 测试都依赖它。 **参数** - `Pi` —— 请求 ID(0–65535)。在回复的 `!~<Pi>` 槽位原样回传,便于流水线发出多请求时解复用。 - `Pg` —— 页号(1 起算;`0` 或省略按 `1` 处理)。现代模拟器几乎不暴露多页内存,故几乎总是 `1`。 - `Pt;Pl;Pb;Pr` —— 边框矩形(上、左、下、右;1 起算,含两端)。四项均必需;省略即整页。 **校验算法** —— xterm 参考实现:从 `0` 起,按阅读顺序逐单元减去 `cell_char_code + sgr_attr_bits`(属性视为带标签的位域:bold = 0x80、underline = 0x40、blink = 0x20、reverse = 0x10 等)。结果对 0x10000 取模即为上报值。**算法与 SGR 位映射在不同模拟器间不同** —— 永远不要跨模拟器实现比对校验和;只在「同模拟器同版本对金值」的语境下使用。 **回复** —— `\x1bP<Pi>!~<HHHH>\x1b\\`。`!~` 中间-末字节对把 DECCKSR 与其它 DCS 回(DECRQSS 的 `$r`、DECRPTAB 的 `$u`、DECRPSS 的 `!u`)区分开。`<HHHH>` 是 4 位前补零的大写十六进制。例:全白矩形在新启动的 xterm 上 → `\x1bP0!~0000\x1b\\`。例:在左上角发 `printf '\x1b[31mABC\x1b[0m'` 后探测第一格 → `\x1bP0!~01A1\x1b\\`(xterm 392;值随版本漂移,故金值与版本绑定)。 **边界** - 坐标越页 → 静默裁剪(无错误回复)。 - 空矩形(`Pt > Pb` 或 `Pl > Pr`)→ 校验和回 `0000`。 - 部分模拟器(旧版 Konsole、某些 xterm 构建)对校验和取一的补码再上报 —— 只比对自家金值,别比对抽象公式。 - 回复默认以 `\x1b\\`(ST 表为 ESC + 反斜杠)结束;xterm 在 8 位 C1 模式(`decscl-compat-level`)下使用单字节 `\x9c`。 **覆盖度** —— **xterm** = 完整(标准)。**mlterm** + **Konsole** + **WezTerm** = 完整。**Ghostty** = 部分(有回但校验和值在 SGR 属性变化时与 xterm 差 ≥ 1 位 —— 视为「有回复,算法不同」)。**Kitty** + **iTerm2** = 部分(部分构建回,部分吞)。**Alacritty** / **Linux console** / **Windows Terminal** / **cmd / ConPTY** / **macOS Terminal** / **gnome-terminal** = 无作用(完全不回 —— 探测务必加 ~100 ms 超时)。
规范出处: DEC VT510 RM (DECRQCRA / DECCKSR) / xterm-ctlseqs (CSI Pi;Pg;Pt;Pl;Pb;Pr * y)
参数
| Pi | 请求 ID,0–65535。在回复的 !~<Pi> 槽原样回传,用于流水线解复用。 |
| Pg | 页号,1 起算。现代模拟器仅暴露第 1 页;省略 / 0 → 1。 |
| Pt;Pl;Pb;Pr | 边框矩形(上、左、下、右;1 起算,含两端)。越页坐标静默裁剪。 |
| Reply <hex4> | 4 位前补零大写十六进制。算法与 SGR 位映射各家不同 —— 仅与同模拟器金值比对。 |
示例
# Probe top-left cell on the main screen, parse the DCS reply.\nprintf '\\033[7;1;1;1;1;1*y'\nIFS= read -rs -d '\\\\' -t 0.1 reply </dev/tty 2>/dev/null\necho \"DECCKSR: ${reply}\" # expect: \\x1bP7!~XXXX\\x1bimport sys, re\n# Parse a DECCKSR reply, extract Pi + hex checksum.\nreply = '\\x1bP42!~01A1\\x1b\\\\'\nm = re.search(r'\\x1bP(\\d+)!~([0-9A-F]{4})\\x1b\\\\', reply)\nif m:\n pi, chk = int(m.group(1)), int(m.group(2), 16)\n print(f'request {pi} checksum 0x{chk:04X}')// Pipeline three checksum probes with distinct Pi.\nfor i, rect := range [][4]int{{1,1,1,1},{1,1,1,80},{1,1,24,80}} {\n pi := i + 1\n fmt.Printf(\"\\x1b[%d;1;%d;%d;%d;%d*y\", pi, rect[0], rect[1], rect[2], rect[3])\n}\n// Demux replies by !~<Pi> matching to issued Pi.// vttest-style: paint, checksum, assert against golden.\nasync function checksum(rect) {\n process.stdout.write(`\\x1b[1;1;${rect.t};${rect.l};${rect.b};${rect.r}*y`);\n for await (const buf of process.stdin) {\n const m = /\\x1bP1!~([0-9A-F]{4})\\x1b\\\\/.exec(buf.toString('binary'));\n if (m) return parseInt(m[1], 16);\n }\n}/* Skeleton: emit probe, read until ST, parse Pi + 4 hex digits. */\nprintf(\"\\x1b[1;1;1;1;1;1*y\"); fflush(stdout);\n/* read until 0x1b 0x5c with 100ms select timeout, then sscanf(\"\\x1bP%d!~%4x\\x1b\\\\\", ...). */终端支持
- xterm
- 支持
- Linux console (fbcon)
- 不支持
- macOS Terminal.app
- 不支持
- iTerm2
- 部分
- Windows Terminal
- 不支持
- cmd.exe / ConPTY
- 不支持
- kitty
- 部分
- alacritty
- 不支持
- WezTerm
- 支持
- Ghostty
- 部分
- GNOME Terminal
- 不支持
- Konsole
- 支持
- tmux
- 不支持
- GNU screen
- 不支持
| xterm | Linux console (fbcon) | macOS Terminal.app | iTerm2 | Windows Terminal | cmd.exe / ConPTY | kitty | alacritty | WezTerm | Ghostty | GNOME Terminal | Konsole | tmux | GNU screen |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 支持 | 不支持 | 不支持 | 部分 | 不支持 | 不支持 | 部分 | 不支持 | 支持 | 部分 | 不支持 | 支持 | 不支持 | 不支持 |