介紹
Base64是一種基于64個(gè)可打印字符來表示二進(jìn)制數(shù)據(jù)的表示方法。由于2的6次方等于64,所以每6個(gè)比特為一個(gè)單元,對應(yīng)某個(gè)可打印字符。三個(gè)字節(jié)有24個(gè)比特,對應(yīng)于4個(gè)Base64單元,即3個(gè)字節(jié)可表示4個(gè)可打印字符。在Base64中的可打印字符包括字母A-Z、a-z、數(shù)字0-9,這樣共有62個(gè)字符,以及加號“+”,斜杠“/”,一共64個(gè)字符,等號“=”用來作為后綴用途。
Base64常用于在通常處理文本數(shù)據(jù)的場合,表示、傳輸、存儲一些二進(jìn)制數(shù)據(jù),完整的base64定義可見RFC 1421和RFC 2045。編碼后的數(shù)據(jù)比原始數(shù)據(jù)略長,為原來的4/3(在電子郵件中,根據(jù)RFC 822規(guī)定,每76個(gè)字符,還需要加上一個(gè)回車換行??梢怨浪憔幋a后數(shù)據(jù)長度大約為原長的135.1%)
why base64
計(jì)算機(jī)中任何數(shù)據(jù)都是按ascii碼存儲的,而ascii碼的128~255之間的值是不可見字符。而在網(wǎng)絡(luò)上交換數(shù)據(jù)時(shí),比如說從A地傳到B地,往往要經(jīng)過多個(gè)路由設(shè)備,由于不同的設(shè)備對字符的處理方式有一些不同(如:有些字符被當(dāng)作控制字符處理掉了,例如傳統(tǒng)的郵件只支持可見字符的傳送,像ASCII碼的控制字符就 不能通過郵件傳送),這樣那些不可見字符就有可能被處理錯(cuò)誤,這是不利于傳輸?shù)摹W詈玫姆椒ň褪窃诓桓淖儌鹘y(tǒng)協(xié)議的情 況下,做一種擴(kuò)展方案來支持二進(jìn)制文件的傳送。把不可打印的字符也能用可打印字符來表示,問題就解決了,Base64編碼應(yīng)運(yùn)而生,Base64就是一種 基于64個(gè)可打印字符來表示二進(jìn)制數(shù)據(jù)的表示方法。
應(yīng)用場景
- 因?yàn)樵缙诘囊恍┼]件服務(wù)器只支持文本信息,不支持二進(jìn)制信息和文件。而base64編碼后的結(jié)果都是純文本的,適合用電子郵件來傳送二進(jìn)制數(shù)據(jù)。
- Base64是網(wǎng)絡(luò)上最常見的用于傳輸8Bit字節(jié)代碼的編碼方式之一,大家可以查看RFC2045~RFC2049,上面有MIME的詳細(xì)規(guī)范。Base64編碼可用于在HTTP環(huán)境下傳遞較長的標(biāo)識信息。
- 嚴(yán)格來說base64不能算是一種加密,只能說是編碼轉(zhuǎn)換。使用base64的初衷,是為了方便把含有不可見字符串的信息用可見字符串表示出來,以便復(fù)制粘貼,開發(fā)過程中也方便調(diào)試和分析
- 一般在網(wǎng)絡(luò)傳輸過程,加密后的數(shù)據(jù)也經(jīng)常Base64轉(zhuǎn)換一下
編碼規(guī)則
編碼處理流程
- 將字符串轉(zhuǎn)換為ASCII碼(實(shí)際就是轉(zhuǎn)換字節(jié)流,java一般叫byte數(shù)組,c語言可以理解為 char 指針指向的內(nèi)容)
- 將每個(gè)字節(jié)的ASCII碼(實(shí)際就是 char 或者 byte)轉(zhuǎn)換為8位二進(jìn)制形式表示
- 取3字節(jié)劃分為一組,共24位,將24位分為4組,每組6位,將每6位二進(jìn)制前補(bǔ)2個(gè)0湊足8位(1字節(jié)),這樣3個(gè)字節(jié)就變成了4個(gè)字節(jié)
- 不斷進(jìn)行步驟3直到數(shù)據(jù)編碼完,在編碼最后一組,如果不足3字節(jié),補(bǔ)足3字節(jié),如果差一個(gè)字節(jié),在編碼結(jié)果后加1個(gè)
=
,如果差2個(gè)字節(jié),在編碼結(jié)果后加2個(gè)=