從原理上搞定編碼-- Base64編碼
開發者對Base64編碼肯定很熟悉,是否對它有很清晰的認識就不一定了。實際 上Base64已經簡單到不能再簡單了,如果對它的理解還是模稜兩可實在不應該。大概介紹一下Base64的相關內容,花幾分鐘時間就可以徹底理解它。文 章下邊貼了一個Base64的編解碼器,方便閱讀文章的同時來實驗。
一. 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"的編碼過程也是一樣的。
三. 總結
說起Base64編碼可能有些奇怪,因為大多數的編碼都是由字元轉化成二進位制的過程,而從二進位制轉成字元的過程稱為解碼。而Base64的概念就恰好反了,由二進位制轉到字元稱為編碼,由字元到二進位制稱為解碼。
Base64編碼主要用在傳輸、儲存、表示二進位制等領域,還可以用來加密,但是這種加密比較簡單,只是一眼看上去不知道什麼內容罷了,當然也可以對Base64的字元序列進行定製來進行加密。
Base64編碼是從二進位制到字元的過程,像一些中文字元用不同的編碼轉為二 進位制時,產生的二進位制是不一樣的,所以最終產生的Base64字元也不一樣。例如"上網"對應utf-8格式的Base64編碼是"5LiK572R", 對應GB2312格式的Base64編碼是"yc/N+A=="。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/18903360/viewspace-1985669/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【字元編碼】字元編碼 && Base64編碼演算法字元演算法
- Base64編碼
- base64 編碼原理
- Base64 編碼解碼原理
- 計算機編碼規則之:Base64編碼計算機
- 【字元編碼系列】Base64編碼原理以及實現字元
- Java之Base64編碼解析Java
- JS 簡單實現UTF-8編碼,Base64編碼JS
- Base64編碼與解碼程式碼例項
- Java 8中的Base64編碼和解碼Java
- 用JS進行Base64編碼、解碼JS
- 【Java小工匠】密碼學--base64編碼Java密碼學
- CryptoAPI 對資料Base64編碼解碼API
- rust實戰系列-base64編碼Rust
- Base64編碼知識詳解
- Java Base64編碼使用介紹Java
- base64編碼原理和函式函式
- Base64編碼的全面介紹
- Rust中字串的base64編碼與解碼Rust字串
- PHP安全的URL字串base64編碼和解碼PHP字串
- C#實現Base64編碼與解碼
- 最少編碼原則
- Base64自定義編碼表及破解
- base64編碼的原理及實現
- 深入瞭解圖片Base64編碼
- android Java BASE64編碼和解碼一:基礎AndroidJava
- Base64系列第二篇 python中使用Base64編碼解碼Python
- Web前端編碼原則Web前端
- 物料編碼原則---by AMT
- Base64 編碼的程式設計使用.md程式設計
- 將ttf檔案base64編碼後使用
- Base64編碼解析以及加密、解密實現加密解密
- 檔案 編碼為Base64字串字串
- Notepad++外掛Base64編解碼
- WebAssembly體驗之編碼base64(AssemblyScript使用教程)Web
- Base64 編碼知識,一文打盡!
- 關於base64編碼的原理及實現
- 網頁圖片Base64編碼深入研究網頁