Base64 是一種基于 64 個可打印字符來表示二進(jìn)制數(shù)據(jù)編碼方式,廣泛運用在處理文本數(shù)據(jù)的場合,表示、傳輸、存儲一些二進(jìn)制數(shù)據(jù),包括 MIME 的電子郵件及 XML 的一些復(fù)雜數(shù)據(jù)。
通過 Base64 編碼后的數(shù)據(jù)比原始數(shù)據(jù)略長,為原來的 4/3,原因是 Base64 是將三個字節(jié)拆分成 4 個 6bit 段進(jìn)行編碼。
Base64 編碼的具體步驟如下
- 對于原始數(shù)據(jù),以每 3 個 8bit 為一組,獲得 24bit
- 將 24bit 劃分為 4 組,每組 6bit
- 將每組 bit 的高位補充 2 個 0,獲得 4 個 8bit
- 將 4 個 8bit 轉(zhuǎn)換為 10 進(jìn)制,對照 Base64 參照表進(jìn)行編碼替換

Base64編碼參照表
這里需要注意的點
- 對于 URL 而言,Base64 參照表的 "+" 和 "/" 是保留字,不會進(jìn)行 URL 編碼,這樣會對解析 URL 產(chǎn)生錯誤,因此需要先將它們替換成諸如 "-_" 等字符,然后參與 URL 編碼
- 由于編碼的是 8bit 字符,因此對于超過 8bit 的字符,如中文字符等,需要進(jìn)行 UTF8 編碼后再進(jìn)行 Base64 編碼
- 字符串末尾有時不足 3 個字符,需要補充 "=" 進(jìn)行占位,具體來說
- 對于末尾只有 1 個字符的情況,轉(zhuǎn)換為 8bit 二進(jìn)制數(shù)據(jù)后,末尾補 0,填充至 12bit,轉(zhuǎn)換為 2 個 Base64 編碼字符,然后再補充 2 個 "=" 作為結(jié)束符
- 對于末尾只有 2 個字符的情況,轉(zhuǎn)換為 8bit 二進(jìn)制數(shù)據(jù)后,末尾補 0,填充至 18bit,轉(zhuǎn)換為 3 個 Base64 編碼字符,然后再補充 1 個 "=" 作為結(jié)束符

Basse64末尾補0
iOS 中的 Base64 編碼與解碼如下所示
NSString *target = @"TEST";
NSData *data = [target dataUsingEncoding:NSUTF8StringEncoding];
NSString *base64Str = [data base64EncodedStringWithOptions:nil];
NSString *base64DecodeStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];