日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Base64 的那些事儿

發(fā)布時間:2023/12/18 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Base64 的那些事儿 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。