iOS Base64編碼

一、介紹

Base64編碼是一種數據編碼方式,目的是讓數據符合傳輸協議的要求。能夠將任何二進制數據,轉換成只有64 +1(“=”等號)個字符組成的文本文件。

提示:Base64不是加密算法,只是一種編碼算法,對數據內容進行編碼不以明文來傳輸。

標準Base64編碼使用的64個字符:


Base64編碼表
二、作用

早期的傳輸協議,如郵件傳輸SMTP協議,只能傳輸ASCII編碼中可打印字符,導致原本8bit字節碼(0-255)超出了可用范圍。所以Base64將原本ASCII碼的控制字符甚至是ASCII編碼之外的字符都轉換成可打印的6bit字符。

提示:ASCII編碼的范圍是0-127,其中0-31和127位共33個字符屬于控制字符,剩下的32-126屬于可打印字符

三、原理

編碼過程:
1、按字符串長度,以每3個8bit的字符為一組
2、對每組獲取每個字符的ASCII編碼(去ASCII編碼表找每個字符的碼位)
3、將ASCII編碼轉換成8bit的二進制,得到一組3*8=24bit的字節
4、再將這24bit劃分為4個6bit的字節,并在每個6bit的字節前面都填兩個高位0,得到4個8bit的字節
5、將這4個8bit的字節轉換成10進制,對照Base64編碼表 (下表),得到對應編碼后的字符。

注意:

  1. 要求被Base64編碼字符是可以用8bit來表示,也就是一個字節來表示的,所以須在ASCII編碼范圍內,\u0000-\u00ff,中文不行,中文需要兩個字節來表示。
  2. 如果被編碼字符長度不是3的倍數的時候,則都用0代替,對應的輸出字符為=。

示例:對 Hello! 進行Base64編碼,按照ASCII表,其轉換過程如下圖所示:


Base64編碼過程

Hello! 的Base64編碼結果為 SGVsbG8h 。
原始字符串長度為6個字符,編碼后長度為8個字符,每3個原始字符經Base64編碼成4個字符,編碼前后長度比4/3。
這個長度比很重要 。比原始字符串長度短,則需要使用更大的編碼字符集,長度比越大,則需要傳輸越多的字符,傳輸時間越長。

Base64應用廣泛的原因是在字符集大小與長度比之間取得一個較好的平衡,適用于各種場景。

注意:Base64編碼是每3個原始字符編碼成4個字符,如果原始字符串長度不能被3整除,那怎么辦?使用0值來補充原始字符串。

示例:對 Hello!! 進行Base64編碼:


用0補充原始字符串的Base編碼過程

注:圖中藍色背景的二進制0值是額外補充的。

Hello!! 的Base64編碼的結果為 SGVsbG8hIQAA 。
最后2個零值只是為了Base64編碼而補充的,在原始字符中并沒有對應的字符,那么Base64編碼結果中的最后兩個字符 AA 實際不帶有效信息,所以需要特殊處理,以免解碼錯誤。
標準Base64編碼通常用 = 字符來替換最后的 A,即編碼結果為 SGVsbG8hIQ==。
因為 = 字符并不在Base64編碼索引表中,其意義在于結束符號,在Base64解碼時遇到 = 時即可知道一個Base64編碼字符串結束。
如果Base64編碼字符串不會相互拼接再傳輸,那么最后的 = 可以省略,解碼時如果發現Base64編碼字符串長度不能被4整除,則先補充 = 字符,再解碼即可。
解碼是對編碼的逆向操作,但注意一點:對于最后的兩個 = 字符,轉換成兩個 A 字符,再轉成對應的兩個6比特二進制0值,接著轉成原始字符之前,需要將最后的兩個6比特二進制0值丟棄,因為它們實際上不攜帶有效信息。

四、代碼
//.h
#import <Foundation/Foundation.h>
@interface NSString (Base64)
/**
 *  轉換為Base64編碼
 */
 - (NSString *)base64EncodedString;
 /**
 *  將Base64編碼還原
 */
 - (NSString *)base64DecodedString;
 @end


//.m
- (NSString *)base64EncodedString;
{
NSData *data = [self dataUsingEncoding:NSUTF8StringEncoding];
return [data base64EncodedStringWithOptions:0];
}

- (NSString *)base64DecodedString
{
NSData *data = [[NSData alloc]initWithBase64EncodedString:self options:0];
return [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
}
五、UTF-8與Base64的區別

UTF-8是Unicode字符集的編碼規則,用于網絡傳輸。
Base64是用來支持某些只支持傳輸ASCII編碼可打印字符的協議,將ASCII編碼中的控制字符與ASCII之外的字符轉換為ASCII可打印字符來用于傳輸。


說明.png
參考鏈接

漫畫:什么是 Base64 算法?
iOS開發探索-Base64編碼
關于base64編碼的原理及實現
ASCII碼對照表

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容