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所替代,也不會造成干擾。
這樣做的結果是在接收端如果接收到轉義字符,就必須要判斷下一個字符是否為特定的三個值,如果是特定的三個值就需要做特殊處理,這就是轉義字符解決通信中防止通信錯誤的原理。