跳到主要内容
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 > PbPl > 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
支持

相关序列