Base64編碼原理:iOS視角

Base64編碼表.png

Base64是一種基于64個(gè)可打印字符來表示二進(jìn)制數(shù)據(jù)的方法。是一種編碼方法,有自己的編碼表,所以稱為Base64,是因?yàn)槠涫褂?4個(gè)字符來對(duì)任意二進(jìn)制數(shù)據(jù)進(jìn)行編碼,同理有Base32、Base16編碼。Base64編碼是從二進(jìn)制到字符的過程。

編碼原理:

1.Base64是基于二進(jìn)制進(jìn)行操作的
2.將二進(jìn)制流每3個(gè)字節(jié)一組(一共是3x8=24bit),劃為4組,每組6個(gè)bit,高位分別用0補(bǔ)齊;
3.這樣我們得到4個(gè)數(shù)字索引,然后查表,獲得相應(yīng)的4個(gè)字符,就是編碼后的字符串。
4.Base64編碼會(huì)把3字節(jié)的二進(jìn)制數(shù)據(jù)編碼為4字節(jié)的文本數(shù)據(jù),所以長(zhǎng)度會(huì)增加1/3。

編碼原理很簡(jiǎn)單,接下來用代碼分析一下:

    NSString *target = @"012"; // 1
    NSData *data = [target dataUsingEncoding:NSUTF8StringEncoding];//2
    NSString *base64Str = [data base64EncodedStringWithOptions:0];//3
    NSLog(@"%@",base64Str);
  1. 用字符串012測(cè)試編碼過程及結(jié)果
  2. 將字符串轉(zhuǎn)成字節(jié)形式
  3. 使用OC api 進(jìn)行編碼
  4. 輸出編碼后的結(jié)果是 MDEy

第2步得到的data一共3個(gè)字節(jié)24個(gè)bit位,16進(jìn)制表示為{0X30,0X31,0X32} 二進(jìn)制表示為 0011 0000 0011 0001 0011 0010 按照6bit一組進(jìn)行截取,然后去編碼表查詢對(duì)應(yīng)字符,結(jié)果為MDEy,如下如:

image.png

特殊處理:
1如果要編碼的二進(jìn)制數(shù)據(jù)不是3的倍數(shù),最后會(huì)剩下1個(gè)或2個(gè)字節(jié),Base64用\x00字節(jié)在末尾補(bǔ)足,再在編碼的末尾加上1個(gè)或2個(gè)=號(hào),表示補(bǔ)了多少字節(jié),補(bǔ)了幾個(gè)字節(jié)就加幾個(gè)=號(hào),解碼的時(shí)候,會(huì)自動(dòng)去掉。

2.由于=字符也可能出現(xiàn)在Base64編碼中,但= 用在URL、Cookie里面會(huì)造成歧義,所以,很多Base64編碼后會(huì)把=去掉。
去掉=后怎么解碼呢?因?yàn)锽ase64是把3個(gè)字節(jié)變?yōu)?個(gè)字節(jié),所以,Base64編碼的長(zhǎng)度永遠(yuǎn)是4的倍數(shù),因此,需要加上=把Base64字符串的長(zhǎng)度變?yōu)?的倍數(shù),就可以正常解碼了。

3.由于標(biāo)準(zhǔn)的Base64編碼后可能出現(xiàn)字符+ 和 /,在URL中就不能直接作為參數(shù),所以又有一種"url safe"的base64編碼,其實(shí)就是把字符+和/分別變成-和
比如:有些平臺(tái)上用的Base64 URL 是標(biāo)準(zhǔn)Base64編碼的一個(gè)變種,分別用 -、
替換標(biāo)準(zhǔn)Base64編碼結(jié)果中的 + 、 / ,并刪除結(jié)果最后的 =

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容