Base64編碼解碼

2022-01-31 19:03:30 字數 1853 閱讀 3860

一. base64編碼由來

為什麼會有base64編碼呢?因為有些網路傳送渠道並不支援所有的位元組,例如傳統的郵件只支援可見字元的傳送,像ascii碼的控制字元就不能通過郵件傳送。這樣用途就受到了很大的限制,比如二進位製流的每個位元組不可能全部是可見字元,所以就傳送不了。最好的方法就是在不改變傳統協議的情況下,做一種擴充套件方案來支援二進位制檔案的傳送。把不可列印的字元也能用可列印字元來表示,問題就解決了。base64編碼應運而生,base64就是一種基於64個可列印字元來表示二進位制資料的表示方法。

二. base64編碼原理

看一下base64的索引表,字元選用了"a-z、a-z、0-9、+、/" 64個可列印字元。數值代表字元的索引,這個是標準base64協議規定的,不能更改。64個字元用6個bit位就可以全部表示,乙個位元組有8個bit位,剩下兩個bit就浪費掉了,這樣就不得不犧牲一部分空間了。這裡需要弄明白的就是乙個base64字元是8個bit,但是有效部分只有右邊的6個bit,左邊兩個永遠是0。

那麼怎麼用6個有效bit來表示傳統字元的8個bit呢?8和6的最小公倍數是24,也就是說3個傳統位元組可以由4個base64字元來表示,保證有效位數是一樣的,這樣就多了1/3的位元組數來彌補base64只有6個有效bit的不足。你也可以說用兩個base64字元也能表示乙個傳統字元,但是採用最小公倍數的方案其實是最減少浪費的。結合下邊的圖比較容易理解。man是三個字元,一共24個有效bit,只好用4個base64字元來湊齊24個有效位。紅框表示的是對應的base64,6個有效位轉化成相應的索引值再對應base64字元表,查出"man"對應的base64字元是"twfu"。說到這裡有個原則不知道你發現了沒有,要轉換成base64的最小單位就是三個位元組,對乙個字串來說每次都是三個位元組三個位元組的轉換,對應的是base64的四個位元組。這個搞清楚了其實就差不多了。

但是轉換到最後你發現不夠三個位元組了怎麼辦呢?願望終於實現了,我們可以用兩個base64來表示乙個字元或用三個base64表示兩個字元,像下圖的a對應的第二個base64的二進位制位只有兩個,把後邊的四個補0就是了。所以a對應的base64字元就是qq。上邊已經說過了,原則是base64字元的最小單位是四個字元一組,那這才兩個字元,後邊補兩個"="吧。其實不用"="也不耽誤解碼,之所以用"=",可能是考慮到多段編碼後的base64字串拼起來也不會引起混淆。由此可見base64字串只可能最後出現乙個或兩個"=",中間是不可能出現"="的。下圖中字元"bc"的編碼過程也是一樣的。

三.程式設計實現(c#)

編碼:

byte bytes=encoding.default.getbytes("

要轉換的字串");

convert.tobase64string(bytes);

解碼:

byte outputb = convert.frombase64string("

ztkwrstj");

string orgstr= encoding.default.getstring(outputb);

參考博文:

base64編碼 解碼

ps base64是一種資料編碼方式,目的是讓資料符合傳輸協議的要求,有些人誤用它進行資料加密 base64編碼 nsstring base64encodedstringwithstring nsstring string base64解碼 nsstring base64decodedstringw...

Base64編碼解碼原理

一.base64編碼由來 為什麼會有base64編碼呢?因為有些網路傳送渠道並不支援所有的位元組,例如傳統的郵件只支援可見字元的傳送,像ascii碼的控制字元就不能通過郵件傳送。這樣用途就受到了很大的限制,比如二進位製流的每個位元組不可能全部是可見字元,所以就傳送不了。最好的方法就是在不改變傳統協議...

關於Base64編碼 解碼

用數字證書簽名或者生成md5摘要結果都是byte陣列,為了方便對簽名結果放在xml中進行傳輸,一般先用base64進行編碼,生成一串可見的ascii字元。接收方收到後在用base64進行decoder生成byte陣列。可進行base64編碼 解碼處理的類有 org.apache.commons.co...