Base 64 Encoding 編碼

作者: JF Zhu  來源: 博客園  發布時間: 2013-01-16 10:28  閱讀: 5401 次  推薦: 13   原文鏈接   [收藏]  

  Base 64 Encoding有什么用?舉個簡單的例子,你使用SMTP協議 (Simple Mail Transfer Protocol 簡單郵件傳輸協議)來發送郵件。因為這個協議是基于文本的協議,所以如果郵件中包含一幅圖片,我們知道圖片的存儲格式是二進制數據(binary data),而非文本格式,我們必須將二進制的數據編碼成文本格式,這時候Base 64 Encoding就派上用場了。

  (一)編碼原理

  Base 64 Encoding 的編碼原理是將每三個字節(byte)轉換為四個字符,每個字符占6 bit。

image

  6 bit一共有64種組合方式,也就是說該編碼共需要使用至少64種字符(后面我們還會介紹一個特殊字符 =)。Base 64 Encoding使用了從 A 到 Z、a 到 z、0 到 9、以及 + 和 / 這些字符(即[A-Za-z0-9+/])。

image

  假設我們有三個字節的數據,byte[] {1, 2, 3},用二進制表示為:

  00000001 | 00000010 | 00000011

  依據上面的原理,使用Basee 64 Encoding編碼后結果應該為:

  000000 | 010000 | 001000 | 000011

  轉換為十進制為 0 | 16 | 8 | 3,對照上面的表,編碼后的文本為 AQID

  既然Base 64 Encoding將每三個字節轉換為四個字符,那如果一幅圖片的字節數不能被3整除該怎么辦?

  如果剩余一個字節,該字節同樣被轉換為四個字符。第一個6 bit轉換成一個字符,接下來2 bit轉換成一個字符(注意這里是向右添加0),最后添加兩個=字符。

image

  假設我們有四個字節的數據,byte[] {1, 2, 3, 4},用二進制表示為:

  00000001 | 00000010 | 00000011 | 00000100

  依據上面的原理,使用Basee 64 Encoding編碼后結果應該為:

  000000 | 010000 | 001000 | 000011 | 000001 | 000000

  轉換為十進制為 0 | 16 | 8 | 3 | 1 | 0,對照上面的表,編碼后的文本為 AQIDBA==

  如果不能被3整除,而余下兩個字節,編碼方式類似剩余一個字節,同樣是轉換成四個字符,最后一個字符用=。

image

  假設我們有五個字節的數據,byte[] {1, 2, 3, 4, 5},用二進制表示為:

  00000001 | 00000010 | 00000011 | 00000100 | 00000101

  依據上面的原理,使用Basee 64 Encoding編碼后結果應該為:

  000000 | 010000 | 001000 | 000011 | 000001 | 000000 | 010100

  轉換為十進制為 0 | 16 | 8 | 3 | 1 | 0 | 20,對照上面的表,編碼后的文本為 AQIDBAU=

  (二)在.Net中的實現

  在.Net中,將二進制數據編碼為文本可以使用public static string ToBase64String(byte[] inArray)方法;從文本文件轉換回二進制數據可以使用public static byte[] FromBase64String(string s)方法。

  下面驗證一下上面講解的例子,分別將三組數據 byte[] {1, 2, 3},byte[] {1, 2, 3, 4},byte[] {1, 2, 3, 4, 5} 進行編碼,并檢驗編碼后的文本是否分別為AQID,AQIDBA==,AQIDBAU=。

byte[] binary1 = new byte[] { 1, 2, 3 }; 
string encoded1 = Convert.ToBase64String(binary1); 
byte[] decoded1 = Convert.FromBase64String(encoded1); 
Console.WriteLine("Encoded string: {0}, Decoded binary is equal to orignial binary? {1}" 
    , encoded1, binary1.SequenceEqual(decoded1));

byte[] binary2 = new byte[] { 1, 2, 3, 4}; 
string encoded2 = Convert.ToBase64String(binary2); 
byte[] decoded2 = Convert.FromBase64String(encoded2); 
Console.WriteLine("Encoded string: {0}, Decoded binary is equal to orignial binary? {1}" 
    , encoded2, binary2.SequenceEqual(decoded2));

byte[] binary3 = new byte[] { 1, 2, 3, 4, 5}; 
string encoded3 = Convert.ToBase64String(binary3); 
byte[] decoded3 = Convert.FromBase64String(encoded3); 
Console.WriteLine("Encoded string: {0}, Decoded binary is equal to orignial binary? {1}" 
    , encoded3, binary3.SequenceEqual(decoded3)); 

  輸出結果為:

  Encoded string: AQID, Decoded binary is equal to orignial binary? True
  Encoded string: AQIDBA==, Decoded binary is equal to orignial binary? True
  Encoded string: AQIDBAU=, Decoded binary is equal to orignial binary? True

  總結:本文介紹了為何要使用編碼,以及Base 64 Encoding編碼的原理,最后還介紹了Base 64 Encoding在.Net中的實現。

13
1
 
標簽:編碼 Base64
 
 

文章列表

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()