通信协议中的转义字符【转】

转自:https://www.cnblogs.com/chucklu/p/6428615.html

http://blog.csdn.net/laoniu_c/article/details/38727339

通信协议中的转义符
作用:在通信协议中用在协议中使得通信的内容更加安全可靠。

举例说明:假设现在需要定制一个通信协议,需要的最基本的就是一个帧头和帧尾的标志,因为通信的接收方才知道什么时候是通信的开始和结束。

那么假设帧头(通信的开始)为0x02(也可以是其他),帧尾为0x03(也可以是其他),粗略的一看是没有问题的,

但是试想如果在帧头和帧尾的中间数据出现0x02或者0x03的时候整个通信过程将会被破坏掉,因为本来一帧数据还没有传输完成,接收方误以为接收到帧头或者帧尾就会重新开始接收数据(导致前面已经接收的数据丢失)或者结束接收数据(导致后面的数据无法接收)。理论上来讲帧头和帧尾无论定义为什么字符都会可能出在通信数据中,因为我们不应该对用户传输的通信数据做出任何的假设。那么如何解决这个问题呢?

转义字符就是用来解决这个问题的,先看下面的这张图片:

STX is short for "start of text"

ETX is short for "end of text"

ESC is short for "escape character"


图片解释:

如果包体中出现0x02就转换成 0x1B 0xE7

如果包体中出现0x03就转换成 0x1B 0xE8

如果包体中出现0x1B就转换成 0x1B 0x00

这张图片中再加入了一个字符即0x1B,这个字符被定义为转义字符(也可以设置为别的),加入这个字符后的传输过程变为,0x02+用户数据+0x03,

但是在用户数据中如果出现0x02即被替换为0x1B+0xE7,如果出现0x03即被替换为0x1B+0xE8,这样用户数据中就绝不会再出现0x02和0x03。

但是万一用户要传输的数据就是0x1B+0xE7呢?这也没有关系,因为如果用户要传输的0x1B也会被转义为0x1B+0x00,

所以假设用户真的需要传输0x1B+0xE7的话也被0x1B+0x00+0xE7所替代,也不会造成干扰。

这样做的结果是在接收端如果接收到转义字符,就必须要判断下一个字符是否为特定的三个值,如果是特定的三个值就需要做特殊处理,这就是转义字符解决通信中防止通信错误的原理。

作者:卢俊涛(ChuckLu)    GitHub    
原文地址:https://www.cnblogs.com/sky-heaven/p/9810002.html