start: 0X7E
end: 0X7F
转义字符:
0X7E -> 0X7D 0X5E
0X7F -> 0X7D 0X5F
0X7D -> 0X7D 0X5D
要传的字符:
0X7D 0X5D 0X7D 0X7D 0X5E 0X7D 0X5F 0X7E
打包添加头尾:
0X7E 0X7D 0X5D 0X7D 0X7D 0X5E 0X7D 0X5F 0X7E 0X7F
0X7D 0X5E 0X7D 0X5D 0X7D 0X7D 0X5E 0X7D 0X5F 0X7E 0X7D 0X5F
要传的数据转义:
原始:0X7D 0X5D 0X7D 0X7D 0X5E 0X7D 0X5F 0X7E
转义后:0X7D 0X5D 0X5D 0X7D 0X5D 0X7D 0X5D 0X5E 0X7D 0X5D 0X5F 0X7D 0X5E
最终数据:
0X7D 0X5E 0X7D 0X5D 0X5D 0X7D 0X5D 0X7D 0X5D 0X5E 0X7D 0X5D 0X5F 0X7D 0X5E 0X7D 0X5F
引入的问题:接收解析时,要传的字符里有0X7E或者0X7F怎么办?
可以将要传的字符里的0X7E和0X7F再次转义。如果转义成另一个字符,总有可能被冲突。
那么可以将一个字符转义成两个字符。如(0X7D 0X5E) (0X7D 0X5F)
又引入了新的问题:接收解析时,要传的字符里原来也就有(0X7D 0X5E) (0X7D 0X5F)怎么办?把0X7D也转义成两个字符,转义成0X7D (非0X5E,非0X5F),比如 (0X7D 0X5D).
0X7D被转义后,接收方解析时看到0X7D,会接着判断下一个字节。每连续处理两个字节的数据确定一个字节。
只有三种情况:
0X7D 0X5E -> 0X7E
0X7D 0X5F -> 0X7F
0X7D 0X5D -> 0X7D
参考 RFC 1662规定的转义字符填充方法。