Base64編碼其實是將3個8位字節轉換為4個6位字節,( 3*8 = 4*6 = 24 ) 這4個六位字節
其實仍然是8位,只不過高兩位被設置為0. 當一個字節只有6位有效時,它的取值空間為0
到 2的6次方減1 即63,也就是說被轉換的Base64編碼的每一個編碼的取值空間為(0~63)
。
事實上,0~63之間的ASCII碼有許多不可見字符,所以應該再做一個映射,映射表為
‘A‘ ~ ‘Z‘ ? ASCII(0 ~ 25)
‘a’ ~ ‘z‘ ? ASCII(26 ~ 51)
‘0’ ~ ‘9‘ ? ASCII(52 ~ 61)
‘+‘ ? ASCII(62)
‘/‘ ? ASCII(63)
這樣就可以將3個8位字節,轉換為4個可見字符。
具體的字節拆分方法為:(圖(畫得不好,領會精神 :-))
aaaaaabb ccccdddd eeffffff
~~~~~~~~ ~~~~~~~~ ~~~~~~~~
字節 1 字節 2 字節 3
||
\/
00aaaaaa 00bbcccc 00ddddee 00ffffff
注:上面的三個字節位原文,下面四個字節為Base64編碼,其前兩位均為0。
這樣拆分的時候,原文的字節數量應該是3的倍數,當這個條件不能滿足時,用全零字節
補足,轉化時Base64編碼用=號代替,這就是為什么有些Base64編碼以一個或兩個等號結
束的原因,但等號最多有兩個,因為:如果F(origin)代表原文的字節數,F(remain)代
表余數,則
F(remain) = F(origin) MOD 3 成立。
所以F(remain)的可能取值為0,1,2.
如果設 n = [F(origin) – F(remain)] / 3
當F(remain) = 0 時,恰好轉換為4*n個字節的Base64編碼。
當F(remain) = 1 時,由于一個原文字節可以拆分為屬于兩個Base64編碼的字節,為了
讓Base64編碼是4的倍數,所以應該為補2個等號。
當F(remain) = 2 時,由于兩個原文字節可以拆分為屬于3個Base64編碼的字節,同理,
應該補上一個等號