標籤:

深度報文檢測基礎之編解碼

摘要

由於網路傳輸的協議限制,並不是所有格式的編碼字元都可以封包傳輸。於是在做報文檢測內容識別時需要將編碼的內容解碼出來,常見的編碼方式有十六進位編碼HEX、百分號編碼、BASE64編碼,u 編碼。HTPP協議在被發明出來時,並沒有考慮到它會有如此之大的影響力,RFC3986文檔規定,Url中只允許包含英文字母(a-zA-Z)、數字(0-9)、-_.~4個特殊字元以及所有保留字元,所以才發明了各種編碼來適應協議傳輸數據。

1 十六進位編碼HEX

在傳輸字元內容時,考慮到一些字元是要作為協議標識的,比如空格,換行符等。所以提出了一種將內容以十六進位轉換的方式來替換掉原始內容的辦法。比如:對字元串「ABC」,我們知道字元『A』, 『B』, 『C』對應十六進位數 0x41,

0x42, 0x43,於是在傳輸的時候以「414243」來代表字元內容「ABC」。對端在收到之後再做解碼操作,還原回原來的字元內容。

2 百分號編碼

Url編碼通常也被稱為百分號編碼(Url Encoding,also known as percent-encoding),是因為它的編碼方式非常簡單,使用%百分號加上兩位的字元——0123456789ABCDEF——代表一個位元組的 十六進位形式。Url編碼默認使用的字符集是US-ASCII。

對於變長的字元編碼,十六進位無法做到正確還原內容,於是發明了一種標記後面帶有字元編碼的格式。比如對於中文字元「中國」,它的utf-8編碼是E4B8AD 和 E59BBD。那麼在url中包含中文字元時就會將中文和空格等內容編碼為百分號形式的內容來傳輸

encodeURI示例

3 BASE64編碼

所謂BASE64編碼,簡單來說就是用64個可見的字元來表示所有字元的一種方式。對於ASCII字元來說,每個字元都是8位,64是2的6次方,也就是說用六個二進位位來表示原來需要8個二進位位的字元。取8 和6 的最小公倍數24,於是可以用4個6進位數來表示3個8進位數。那如果編碼的內容最小也不夠3個字元怎麼辦呢?可以用0填充,使編碼內容湊夠3個字元,輸出內容使用『=』 因此編碼後輸出的文本末尾可能會出現1或2個『=』。

為了保證所輸出的編碼位可讀字元,Base64制定了一個編碼表,以便進行統一轉換。編碼表的大小為2^6=64,這也是Base64名稱的由來。

base64編碼表

4 u編碼

u編碼即Unicode編碼,在JavaScript中有一對函數可以對內容進行編解碼,這對函數是escape()和unescape()。形式如百分號編碼,需要注意的是:此函數編碼使用的字符集是usc2編碼,與gb2312編碼兼容。實際就是Unicode的2位元組編碼實現。示例如下:

escap和unescape函數演示

推薦閱讀:

iOS KVO crash 自修復技術實現與原理解析
讓人困擾的Python 2編碼
引得市缺字字體編碼方案說明

TAG:編碼 |