Base64 的那些事儿
一、Base64是什么?
Base64是一種編碼的格式。是將信息流(字節(jié)流)按照一定的規(guī)范,重新組合,顯示出完全不相關內(nèi)容的編碼格式。
ps.定義是我自己總結的,我覺得對于知識的定義,只要簡潔,不錯誤,表述清楚,不要拘泥于一個字一個詞,重要的是真正理解它的原理即可。(其實是因為自己根本不知道標準的定義是什么...)
二、Base64的由來?
對計算機信息存儲稍有了解的人,都清楚,在計算機內(nèi)部是以二進制來存儲一切信息的。而直接以二進制為單元進行處理,顯然是不方便處理的,如果數(shù)量級過大,我們往往采用增加計數(shù)單位的形式。(有興趣的同學可以參考《從1到無窮大》這本書),所以在計算機世(防盜連接:本文首發(fā)自http://www.cnblogs.com/jilodream/ )界中就出現(xiàn)了字節(jié)這個東西。以每8個bit位組成一個字節(jié)。這樣任何信息都可以劃分為占用多少多少個字節(jié)來說。如下表所示:
根據(jù)大家的認知,大小寫一共52個字母、外加數(shù)字加特殊符號等,一個字節(jié)是完全可以表述完整的單個字符的(這里使用的就是ASCII對照表)。
但是對于非英語國家來說就比較頭疼了。發(fā)送信息之前翻譯成英語,收到之后再翻譯為本國語言,顯然是成本非常高的。怎么解決呢?就是使用多個字節(jié)來表示一個字符。這樣UTF-8、GBK、UNICODE等編碼就應運而生了(有興趣的同學可以查下它們的區(qū)別)。這些編碼基本解決了世界上已知語言在計算中有效存儲流動的問題。
但是問題又來了,有時候我們使用的設備,根本就不支持這些復雜的國際化編碼。
舉個例子,我在家給領導發(fā)了封郵件,說最近身體不適,打算請?zhí)旒偃タ纯赐饷娴氖澜纭?/span>
我的表情是這樣的:
?
領導打開郵件之后,發(fā)現(xiàn)是一屏幕的亂碼,而且發(fā)現(xiàn)我今天沒來。
領導的表情是這樣的:
?
當我心情愉悅的假后來上班時,領導面帶微笑的問我這兩天去哪里時。
我的表情是這樣的:
?
當領導和我說:電話打不通,郵件是亂碼,人也失蹤的時候。
我的表情是這樣的:
?
?
當我解釋事情是這樣的:巴拉巴拉。
我的表情是這樣的:“這件事情是這樣的,說起來你可能不信 但真的是垃圾桶先動的手”
?
在聽了我的解釋以后。
領導的表情是這樣的:
?
好了言歸正傳,為什么會出現(xiàn)上游(我)發(fā)送的消息,到了下游(領導)就出現(xiàn)無法理解的情況呢?
這是由于歷史原因,早前Email只被允許傳送ASCII字符(不知道現(xiàn)在是否改善),即一個字節(jié)的低7位,也就是128種表示。于是當我用各種國際字符發(fā)送消息時,勢必就會出現(xiàn)字節(jié)的最高位居然是1的問題(防盜連接:本文首發(fā)自http://www.cnblogs.com/jilodream/ )。考慮到健壯性和容錯性,有些網(wǎng)絡設備就會把首bit位置換成0。而原本整套的非ASCII碼的字符,就被硬生生的轉成一套ASCII碼。于是當收件者打開郵件進行閱讀時,郵件系統(tǒng)將收到數(shù)據(jù)硬生生的再轉成非ASCC碼時,一切都晚了。(記得早前,大學老師去歐洲德國留學,給老師寫email只能用拼音)。
其實除去網(wǎng)關,其他路由等硬件設備都會出現(xiàn)這樣那樣的不支持問題。(對于128~255這些不可見字符,不同路由設備在接收后的處理是不一樣的,這也就是為什么發(fā)送信息經(jīng)常使用轉碼,而不是采用直接傳輸單個字節(jié)這一套方法(此處可看http://www.zhihu.com/question/36306744/answer/71626823 郭無心的敘述)。而除去郵件系統(tǒng),其他很多系統(tǒng)也會因為不支持某些特殊字符,造成發(fā)送方和接收方,雙方的信息的不一致。
這里簡單舉個例子,我們通過互聯(lián)網(wǎng)聊天時,數(shù)據(jù)都是先發(fā)送給服務端。服務端發(fā)現(xiàn)信息中包含了某個特殊字符,而服務端本身又不支持這個特殊字符。于是就從字庫里,找到默認字符補填。這樣接收方收到消息時,這個特殊字符就顯示不出來了。取而代之的是一些缺省字符,如‘◇’,‘□’。(ps,印象中QQ游戲是不支持‘.’這個特殊字符的)。
為了解決此類的種種問題,于是Base64就應運而生了。
三、Base64是如何處理字符串編碼的?
這里先直入正題,闡述關于Base64編碼的情況。
首先明確這樣一個前提,所有信息肯定都是以字節(jié)的形式存在的。那么他的長度對于3這個數(shù)字有三種分類:
(1)長度除以3余0:len%3=0;
(2)長度除以3余1:len%3=1;
(3)長度除以3余2:len%3=2;
第(1)情況:
我們把每3個字(防盜連接:本文首發(fā)自http://www.cnblogs.com/jilodream/ )節(jié)劃分成一份,然后再把它平均拆分成4份。那么每份就有6個bit位。
3*8bit=24bit=4*6bit
然后每一個單元前邊再加個00,這樣就使得每個單元等等于8位,即一個比特位。
如表,我們可以發(fā)現(xiàn),每個字節(jié)真正有效的特征bit位只有6位。2^6=8*8=64。也就是每個字節(jié)都可以表現(xiàn)出64種特征。這也正是base64的由來。
第(2)情況:
我們把每3個字節(jié)劃分成一份,然后再把它平均拆分成4份。最后剩余1個字節(jié),則拆分成6+2的形式,8bit=6+2bit,如下表:
這里會涉及到下邊兩種場景
1)對于不足6bit位的單元:這個直接在結尾補0,直到6位。這里最后剩余2個bit位。
2)對于完全沒有分配的單元,則直接使用“=”放置在單元中。這里最后補充2個=。
與場景(1)類似,單元格數(shù)字前邊補‘0’
第(3)情況
我們把每3個字節(jié)劃分成一份,然后再把它平均拆分成4份。最后剩余2個字節(jié),則拆分成6+6+4的形式,16bit=6*2+2bit,如下表:
這里與場景(2)類似會涉及到下邊兩種場景
1)對于不足6bit位的單元:這個直(防盜連接:本文首發(fā)自http://www.cnblogs.com/jilodream/ )接在結尾補0,直到6位。這里最后剩余4個bit位。
2)對于完全沒有分配的單元,則直接使用“=”放置在單元中。這里最后補充1個=。
這樣,無論信息的長度是多少,都能以這樣的規(guī)則(base64編碼規(guī)范),重新劃分成新的字節(jié)(符)流。
同時還有一份base64的編碼轉換表:
如下表:
這樣,無論任意的字節(jié)流,我們都可以用表中的字符+‘=’來表示了。這就是所謂的Base64編碼過程了。通過Base64編碼,我們可以很好的解決前文中遺留下的問題。
而對于Base64解碼的過程,原理與上述一致,只是一個逆過程,這里不再贅述。
四、Base64編碼技術的應用
(1)?傳輸數(shù)據(jù),盡量做到數(shù)據(jù)可(防盜連接:本文首發(fā)自http://www.cnblogs.com/jilodream/ )以在網(wǎng)絡中正常傳輸,同時不會因為硬件或者軟件不兼容,導致數(shù)據(jù)失真。
(2)?對數(shù)據(jù)進行簡單加密,如對于URL或者地址空間的處理(如百度云地址、p2p鏈接),可以通過簡單的Base64進行簡單的處理,防止肉眼可以直視出這些信息的處理規(guī)則。同時也可以有效的進行互聯(lián)網(wǎng)信息傳輸。
轉載于:https://www.cnblogs.com/jilodream/p/5568800.html
總結
以上是生活随笔為你收集整理的Base64 的那些事儿的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Windows数据库编程接口简介
- 下一篇: 计划任务 at,cron