辶喿与辶臿可以作为两种独立符号,组成只含这两类元素的序列。针对这种输入,本文给出一套轻量的自定义编码方案:先把每个符号映射为一位,再将位流按字节打包,并在开头记录符号数量。这样既能还原原序列,也能避免为每个符号重复保存相同的文字编码字节。
编码规则与数据结构
编码前先按完整符号切分输入。辶喿对应比特0,辶臿对应比特1;两者都视为一个不可拆分的符号,而不是把其中的“辶”单独编码。这个约定让解码器只需读取一位,就能确定输出哪一个符号。
| 字段 | 具体取值 | 作用 |
|---|---|---|
| 符号A | 辶喿 → 0 | 表示序列中的第一类元素 |
| 符号B | 辶臿 → 1 | 表示序列中的第二类元素 |
| 位序 | 每字节从最高位到最低位 | 统一编码与解码的读取方向 |
| 长度字段 | 无符号LEB128,单位为符号个数 | 告诉解码器需要还原多少个符号 |
完整数据由两部分顺序组成:先写符号总数,再写打包后的比特载荷。长度字段使用无符号LEB128,因此短序列通常只占一个字节,较长序列也可以继续扩展。位流按最高位优先写入;最后一个字节若没有填满,未使用的低位补0。解码时以长度字段为准,不把补位误读成额外符号。
编码示例
以“辶喿、辶臿、辶臿、辶喿”为例,依照映射规则得到比特串0110。四位放入一个字节后,补齐低位为0,载荷就是01100000,即十六进制60。符号数量4以一个字节04记录,因此完整数据为:
04 60
解码器读到04后,知道需要输出4个符号;再从60的最高位开始读取四位,依次得到0、1、1、0,最终还原为“辶喿、辶臿、辶臿、辶喿”。低四位是填充位,不参与输出。这个例子同时说明,长度字段不可省略:如果只保存载荷,解码器无法区分有效末尾比特与补齐的0。
快速编码与解码流程
编码时,逐个检查输入是否为两个约定符号之一,并将对应比特写入当前字节。每收集八位就输出一个字节;剩余不足八位时,在低位补0。随后把符号数量编码为LEB128,并放在载荷之前。输入中出现其他字符时,应返回格式错误,而不是擅自转换成0或1,否则原序列会发生不可逆变化。
encode(tokens):
bits = map(辶喿→0, 辶臿→1, tokens)
payload = 按最高位优先打包(bits),末字节低位补0
return ULEB128(tokens.length) + payload
解码时,先读取LEB128长度n,再计算载荷字节数ceil(n/8)。按最高位优先逐位取出n个比特:0输出辶喿,1输出辶臿。读不到所需载荷、长度字段不完整或字段超出允许整数范围时,应停止解码并报告数据损坏;如果末字节存在补位,还可检查未使用的低位是否全为0。
decode(data):
n, offset = read_uleb128(data)
require data 至少包含 offset + ceil(n/8) 个字节
repeat n 次:
bit = 按最高位优先读取一位
输出 0→辶喿,1→辶臿
压缩效果与适用范围
按UTF-8保存时,辶喿和辶臿各由两个汉字组成,每个符号占6字节;四个符号原本需要24字节。上述编码用1字节记录数量、1字节保存载荷,共2字节,示例长度缩小约91.7%。对于较长序列,载荷约为每个符号八分之一字节,长度字段带来的开销占比会逐渐降低。
这种压缩适合符号集合固定、输入由辶喿与辶臿反复组成的场景,例如内部标记流、测试数据或专用传输字段。它不适合直接编码任意汉字,也不包含校验和、字符集转换或额外元数据。只要发送方和接收方采用相同的符号映射、位序和长度规则,辶喿与辶臿序列就能以紧凑形式保存,并在解码时按原顺序恢复。