Base64編碼的深入認(rèn)識(shí)與理解
Base64編碼的深入認(rèn)識(shí)與理解
之前在很多業(yè)務(wù)中都有見過或者用到過Base64編碼,但一直一知半解,沒有對(duì)它有一個(gè)深入的認(rèn)識(shí)和理解。今天就來聊一聊Base64編碼的問題。
首先要明確的是,Base64是一種可逆的編碼方式,提到編碼方式,我們首先想到的肯定是Ascii、GBK、Unicode這些常用的編碼方法,那么Base64與這些編碼方式有什么不同呢?
簡(jiǎn)單來將,Base64就是一種用64個(gè)Ascii字符來表示任意二進(jìn)制數(shù)據(jù)的方法。主要用于將不可打印的字符轉(zhuǎn)換成可打印字符,或者簡(jiǎn)單的說將二進(jìn)制數(shù)據(jù)編碼成Ascii字符。Base64是網(wǎng)絡(luò)上最常用的傳輸8bit字節(jié)數(shù)據(jù)的編碼方式之一。
Base64的原理其實(shí)很簡(jiǎn)單,首先,需要準(zhǔn)備一個(gè)包含64個(gè)字符的表格(如下表),0~63分別對(duì)應(yīng)了唯一一個(gè)字符,比如18對(duì)應(yīng)的是S。
然后,對(duì)二進(jìn)制數(shù)據(jù)進(jìn)行處理,每3個(gè)字節(jié)一組,一共3x8=24bit,將這24bit劃分為4組,每組正好6個(gè)bit,6bit的數(shù)據(jù)剛好可以表示0~63的范圍,也就可以對(duì)應(yīng)上表的64個(gè)字符。這樣我們就得到了4個(gè)數(shù)字作為索引,然后查表獲得相應(yīng)的4個(gè)字符,就得到了編碼后的字符串。下表將整個(gè)處理的過程描述的很清楚。
文本 | M | a | n | |||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
ASCII編碼 | 77 | 97 | 110 | |||||||||||||||||||||
二進(jìn)制位 | 0 | 1 | 0 | 0 | 1 | 1 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | 0 | 1 | 1 | 1 | 0 |
索引 | 19 | 22 | 5 | 46 | ||||||||||||||||||||
Base64編碼 | T | W | F | u |
所以,Base64編碼會(huì)把3字節(jié)的二進(jìn)制數(shù)據(jù)編碼為4字節(jié)的文本數(shù)據(jù),長(zhǎng)度增加為原來的4/3。如果要編碼的二進(jìn)制數(shù)據(jù)不是3的倍數(shù),最后會(huì)剩下1個(gè)或2個(gè)字節(jié)怎么辦?此時(shí),需在原數(shù)據(jù)后面添加1個(gè)或2個(gè)零值字節(jié),使其字節(jié)數(shù)是3的倍數(shù)。然后,在編碼后的字符串后面添加1個(gè)或2個(gè)等號(hào)“=”,表示所添加的零值字節(jié)數(shù)。解碼的時(shí)候,會(huì)自動(dòng)去掉。
下面來看一下Base64編碼的優(yōu)缺點(diǎn)。
優(yōu)點(diǎn):可以將二進(jìn)制數(shù)據(jù)轉(zhuǎn)換成可打印字符,方便傳輸數(shù)據(jù);對(duì)數(shù)據(jù)進(jìn)行簡(jiǎn)單的加密,肉眼安全。
缺點(diǎn):內(nèi)容編碼后的體積會(huì)變大,編碼和解碼需要額外的工作量。
它的使用場(chǎng)景有很多,比如將圖片等資源文件以Base64編碼形式直接放于代碼中,使用的時(shí)候反Base64后轉(zhuǎn)換成Image對(duì)象使用;有些文本協(xié)議不支持不可見字符的傳遞,只能轉(zhuǎn)換成可見字符來傳遞信息。有時(shí)在一些特殊的場(chǎng)合,大多數(shù)消息是純文本的,偶爾需要用這條純文本通道傳一張圖片之類的情況發(fā)生的時(shí)候,就會(huì)用到Base64,比如多功能Internet 郵件擴(kuò)充服務(wù)(MIME)就是用Base64對(duì)郵件的附件進(jìn)行編碼的。
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
相關(guān)文章
MATLAB教程數(shù)據(jù)運(yùn)算變量操作及矩陣表示詳解
這篇文章主要介紹了MATLAB關(guān)于數(shù)據(jù)運(yùn)算變量操作及矩陣表示的內(nèi)容詳解,有需要的朋友可以借鑒參考下,希望可以有所幫助,祝大家多多進(jìn)步2021-09-09解決使用IDE Run運(yùn)行出錯(cuò)package pack/test is not in GOROOT (/usr/loca
這篇文章主要介紹了解決使用IDE Run運(yùn)行出錯(cuò)package pack/test is not in GOROOT (/usr/local/go/src/pack/test),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11幾道和「黑洞照片」那種海量數(shù)據(jù)有關(guān)的算法問題
昨晚被一則新聞刷屏:北京時(shí)間 4 月 10 日今晚 9 點(diǎn),人類首張黑洞照片正式發(fā)布2019-04-04thymeleaf實(shí)現(xiàn)th:each雙重多重嵌套功能
今天給大家分享一個(gè)使用 thymeleaf 實(shí)現(xiàn)一個(gè)動(dòng)態(tài)加載一二級(jí)文章分類的功能,本文通過代碼講解的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2019-11-11