Base64

前幾天,在處理IOS-SDK,遇到了歷史遺留關(guān)于base64相關(guān)的問題,于是翻查資料,并總結(jié)如下

  1. US-ASCII
  2. RFC 2045
  3. RFC 3548

Base64 內(nèi)容傳輸編碼

Base64 內(nèi)容傳輸編碼旨在表示任意形式的八位字節(jié)序列督函,不需要人為可讀。編碼和解碼算法很簡(jiǎn)單激挪,但是編碼數(shù)據(jù)始終只比原始數(shù)據(jù)大 33%的未編碼的數(shù)據(jù)辰狡。這種編碼實(shí)際上使用的編碼與 RFC 1421 中定義的隱私增強(qiáng)郵件 (PEM) 應(yīng)用程序中的編碼相同。

RFC2045_Base64.png

說明:
使用 65 個(gè)字符的 US-ASCII 子集垄分,每個(gè)可打印字符可以使用2進(jìn)制的 6 位表示搓译。(額外的第 65 個(gè)字符,“=”锋喜, 用于表示特殊的處理功能些己。)
即: 0011 1111 表示 "/" (10進(jìn)制63), 0011 1110 表示"+"(10進(jìn)制62) 如圖。 由于6位只能到63 即 64個(gè)字符嘿般,所以使用額外的第65個(gè)字符"="來表示特殊的處理功能段标,即常說的對(duì)齊

編碼過程:

將24位的輸入位組表示為輸出由4個(gè)編碼字符(一個(gè)字符8位)組成的字符串。 從左到右炉奴,24位輸入組由3個(gè)8位輸入組串聯(lián)而成逼庞。這24位然后被視為4個(gè)連接的6位組,每組在base64字母表中轉(zhuǎn)換成一個(gè)數(shù)字瞻赶。當(dāng)通過base64編碼對(duì)位流進(jìn)行編碼時(shí)赛糟,位流必須假定最有效位在前面。也就是說砸逊,流中的第一個(gè)比特將是進(jìn)入的高階比特第一個(gè)8位字節(jié)璧南,第8位將是低階位第一個(gè)8位字節(jié),以此類推师逸。
比如: UTF-8編碼下A進(jìn)行base64Encode后輸出是QQ==
A在十進(jìn)制下是65轉(zhuǎn)換成2進(jìn)制為 0100 0001 (一個(gè)字節(jié)8位)
一個(gè)字節(jié)只能組成2個(gè)6位 不足的補(bǔ)0
視為4個(gè)連接的6位組: 01 0000 01 0000
補(bǔ)全為8位: 0001 0000 0001 0000
其中 0001 0000 轉(zhuǎn)為10進(jìn)制即16司倚, 對(duì)應(yīng)表 RFC2045_Base64.png 為Q

然后會(huì)轉(zhuǎn)換成ASCII下的 0101 0001 0101 0001 0011 1101 0011 1101

故A進(jìn)行base64Encode后輸出是QQ==(=是用來對(duì)齊的,因?yàn)橐獦?gòu)成4個(gè)字節(jié)即32位)

參考JAVA的Base64.java 的具體做法是:


Base64.java.png

由于只有一個(gè)字符所以重點(diǎn)在 if(sp < end)里面
b0 = 65 (src[sp++] = src[0] = A = 65)
dst[0] = base64[16] (RFC2045_Base64.png) 即dst[0] = Q (ASCII 值為 81)
然后sp == end (都是1)
des[1] = base64[16] (RFC2045_Base64.png) 即dst[0] = Q (ASCII 值為 81)
des[2] = '='
des[3] = '='

所以得到的byte[] 的長(zhǎng)度為4 值為 QQ==

Base64.png

其他情況同理可得
細(xì)心的朋友可能發(fā)現(xiàn)了上圖中有個(gè)toBase64URL并且是RFC 4648篓像,結(jié)合上面的RFC 3548
他們的差異總得來說就是3548過時(shí)了动知,但是實(shí)際上區(qū)別也并不算大
而我所遇到的問題恰恰也就是這些問題---因?yàn)楹蠖私涌谏?jí)而OC代碼混用接口,導(dǎo)致Base64解碼失斣北纭(實(shí)際情況很簡(jiǎn)單盒粮,但是因?yàn)閷?duì)OC代碼的不熟悉,對(duì)上一個(gè)編寫代碼的人的風(fēng)格也掌握不到位奠滑,所以導(dǎo)致理解出了問題----雖然我至今也不理解為什么他要這樣做)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末丹皱,一起剝皮案震驚了整個(gè)濱河市妒穴,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌种呐,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件弃甥,死亡現(xiàn)場(chǎng)離奇詭異爽室,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)淆攻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門阔墩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人瓶珊,你說我怎么就攤上這事啸箫。” “怎么了伞芹?”我有些...
    開封第一講書人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵忘苛,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我唱较,道長(zhǎng)扎唾,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任南缓,我火速辦了婚禮胸遇,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘汉形。我一直安慰自己纸镊,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開白布概疆。 她就那樣靜靜地躺著逗威,像睡著了一般。 火紅的嫁衣襯著肌膚如雪岔冀。 梳的紋絲不亂的頭發(fā)上庵楷,一...
    開封第一講書人閱讀 49,036評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音楣颠,去河邊找鬼尽纽。 笑死,一個(gè)胖子當(dāng)著我的面吹牛童漩,可吹牛的內(nèi)容都是我干的弄贿。 我是一名探鬼主播,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼矫膨,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼差凹!你這毒婦竟也來了期奔?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤危尿,失蹤者是張志新(化名)和其女友劉穎呐萌,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體谊娇,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡肺孤,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了济欢。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片赠堵。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖法褥,靈堂內(nèi)的尸體忽然破棺而出茫叭,到底是詐尸還是另有隱情,我是刑警寧澤半等,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布揍愁,位于F島的核電站,受9級(jí)特大地震影響杀饵,放射性物質(zhì)發(fā)生泄漏吗垮。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一凹髓、第九天 我趴在偏房一處隱蔽的房頂上張望烁登。 院中可真熱鬧,春花似錦蔚舀、人聲如沸饵沧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽狼牺。三九已至,卻和暖如春礼患,著一層夾襖步出監(jiān)牢的瞬間是钥,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國打工缅叠, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留悄泥,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓肤粱,卻偏偏與公主長(zhǎng)得像弹囚,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子领曼,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容