X.509公鑰證書也好,電子郵件資料也好,經常要用到Base64編碼,那麼為什麼要作一下這樣的編碼呢?
我們知道在計算機中的位元組共有256個組合,對應就是ascii碼,而ascii碼的128~255之間的值是不可見字元。而在網路上交換資料時,比如說從A地傳到B地,往往要經過多個路由裝置,由於不同的裝置對字元的處理方式有一些不同,這樣那些不可見字元就有可能被處理錯誤,這是不利於傳輸的。所以就先把資料先做一個Base64編碼,統統變成可見字元,這樣出錯的可能性就大降低了。
對證書來說,特別是根證書,一般都是作Base64編碼的,因為它要在網上被許多人下載。電子郵件的附件一般也作Base64編碼的,因為一個附件資料往往是有不可見字元的。
那麼Base64到底是怎樣編碼的呢?
簡單來說,任何一個數據無非可以看作一個位元流,如01000100010011101100111010111100011001010......那麼我們取6個位元為一組,計算它的ascii值,得到一個字元,這個字元肯定是可見字元,好,把它對應的字元寫出來,再取6個位元,計算...,如此下去,直到最後,就完成了編碼。
1.標準base64只有64個字元(英文大小寫、數字和+、/)以及用作字尾等號;
2.base64是把3個位元組變成4個可列印字元,所以base64編碼後的字串一定能被4整除(不算用作字尾的等號);
3.等號一定用作字尾,且數目一定是0個、1個或2個。這是因為如果原文長度不能被3整除,base64要在後面新增\0湊齊3n位。為了正確還原,添加了幾個\0就加上幾個等號。顯然新增等號的數目只能是0、1或2;
4.嚴格來說base64不能算是一種加密,只能說是編碼轉換。使用base64的初衷。是為了方便把含有不可見字串的資訊用可見字串表示出來,以便複製貼上;
---------------------------------------------------------------------------------------------
提供一個工作中用到過的base64場景
一個xml當中包含另一個xml資料,此時如果將xml資料直接寫入顯然不合適,將xml進行適當編碼存入較為方便,事實上xml當中的字元一般都是可見字元(0-127之間),但是由於中文的存在,可能存在不可見字元,直接將字元列印在外層xml的資料中顯然不合理,那麼怎麼辦呢?
可以使用base64進行編碼,然後存入xml,解碼反之
其實還有個辦法,將byte的值寫在xml當中,空格或者,分開,這樣也可以將byte資料傳入,不過這樣更浪費空間,並且不易儲存.
另一個,比如http協議當中的key value欄位,必須進行URLEncode 不然出現的等號可能使解析失敗 空格也會使http請求解析出現問題,比如 請求行就是以空格來劃分的 POST /guowuxin/hehe HTTP/1.1
又比如有些文字協議不支援不可見字元的傳遞,只能用大於32的可見字元來傳遞資訊(協議規定)
X.509公鑰證書也好,電子郵件資料也好,經常要用到Base64編碼,那麼為什麼要作一下這樣的編碼呢?
我們知道在計算機中的位元組共有256個組合,對應就是ascii碼,而ascii碼的128~255之間的值是不可見字元。而在網路上交換資料時,比如說從A地傳到B地,往往要經過多個路由裝置,由於不同的裝置對字元的處理方式有一些不同,這樣那些不可見字元就有可能被處理錯誤,這是不利於傳輸的。所以就先把資料先做一個Base64編碼,統統變成可見字元,這樣出錯的可能性就大降低了。
對證書來說,特別是根證書,一般都是作Base64編碼的,因為它要在網上被許多人下載。電子郵件的附件一般也作Base64編碼的,因為一個附件資料往往是有不可見字元的。
那麼Base64到底是怎樣編碼的呢?
簡單來說,任何一個數據無非可以看作一個位元流,如01000100010011101100111010111100011001010......那麼我們取6個位元為一組,計算它的ascii值,得到一個字元,這個字元肯定是可見字元,好,把它對應的字元寫出來,再取6個位元,計算...,如此下去,直到最後,就完成了編碼。
1.標準base64只有64個字元(英文大小寫、數字和+、/)以及用作字尾等號;
2.base64是把3個位元組變成4個可列印字元,所以base64編碼後的字串一定能被4整除(不算用作字尾的等號);
3.等號一定用作字尾,且數目一定是0個、1個或2個。這是因為如果原文長度不能被3整除,base64要在後面新增\0湊齊3n位。為了正確還原,添加了幾個\0就加上幾個等號。顯然新增等號的數目只能是0、1或2;
4.嚴格來說base64不能算是一種加密,只能說是編碼轉換。使用base64的初衷。是為了方便把含有不可見字串的資訊用可見字串表示出來,以便複製貼上;
---------------------------------------------------------------------------------------------
提供一個工作中用到過的base64場景
一個xml當中包含另一個xml資料,此時如果將xml資料直接寫入顯然不合適,將xml進行適當編碼存入較為方便,事實上xml當中的字元一般都是可見字元(0-127之間),但是由於中文的存在,可能存在不可見字元,直接將字元列印在外層xml的資料中顯然不合理,那麼怎麼辦呢?
可以使用base64進行編碼,然後存入xml,解碼反之
其實還有個辦法,將byte的值寫在xml當中,空格或者,分開,這樣也可以將byte資料傳入,不過這樣更浪費空間,並且不易儲存.
另一個,比如http協議當中的key value欄位,必須進行URLEncode 不然出現的等號可能使解析失敗 空格也會使http請求解析出現問題,比如 請求行就是以空格來劃分的 POST /guowuxin/hehe HTTP/1.1
又比如有些文字協議不支援不可見字元的傳遞,只能用大於32的可見字元來傳遞資訊(協議規定)