跳到主要内容
ansicode

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[\x1b[Pi;Pg;Pt;Pl;Pb;Pr*y reply \x1bP<Pi>!~<hex4>\x1b\\
\\033[\033[Pi;Pg;Pt;Pl;Pb;Pr*y reply \033P<Pi>!~<hex4>\033\\
\\e[\e[Pi;Pg;Pt;Pl;Pb;Pr*y reply \eP<Pi>!~<hex4>\e\\
ESC [ESC [ <Pi> ; <Pg> ; <Pt> ; <Pl> ; <Pb> ; <Pr> * y reply: ESC P <Pi> ! ~ <hex4> ESC \\
hex1b 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 位映射各家不同 —— 仅与同模拟器金值比对。

示例

bash
# 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\\x1b
python
import 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}')
go
// 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.
javascript
// 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}
c
/* 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
不支持

相关序列