Base 64 編碼

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

轉載請註明出處post

 

 

(一)Encoding VS. Encryption編碼

不少人都覺得編碼(Encoding)和加密(Encryption)是同一個意思。編碼和加密都是對格式的一種轉換,可是它們是有區別的。編碼是公開的,好比下面要介紹的Base 64編碼,任何人均可以解碼;而加密則相反,你只但願本身或者特定的人才能夠對內容進行解密。加密

 

(二)Base 64編碼spa

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

 

1. 編碼原理htm

 

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

 

clip_image001

 

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

 

clip_image002

 

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

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中的實現。

相關文章
相關標籤/搜索