Base 64 編碼


原創地址:http://www.cnblogs.com/jfzhu/p/4020097.html

轉載請注明出處

 

 

(一)Encoding VS. Encryption

很多人都以為編碼(Encoding)和加密(Encryption)是同一個意思。編碼和加密都是對格式的一種轉換,但是它們是有區別的。編碼是公開的,比如下面要介紹的Base 64編碼,任何人都可以解碼;而加密則相反,你只希望自己或者特定的人才可以對內容進行解密。

 

(二)Base 64編碼

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

 

1. 編碼原理

 

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

 

clip_image001

 

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

 

clip_image002

 

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

00000001 | 00000010 | 00000011

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

000000 | 010000 | 001000 | 000011

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

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

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

 

clip_image003

 

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

00000001 | 00000010 | 00000011 | 00000100

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

000000 | 010000 | 001000 | 000011 | 000001 | 000000

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

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

 

clip_image004

 

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

00000001 | 00000010 | 00000011 | 00000100 | 00000101

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

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

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

 

2. 在.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 編碼的原理,最后還介紹了Base 64 Encoding在.Net中的實現。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM