Base64

作者:劉巍然-學酥
鏈接:https://www.zhihu.com/question/38036594/answer/74917716
來源:知乎
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。

那麼,Base64又是什麼呢?和我們聽說過的Hex編碼,ASCII編碼,UTF-8編碼什麼的,有什麼關係嗎?我儘量用簡單的語言來講講故事。
==============================
1 計算機開始之初,二進制與Hex

計算機這個東西,最初是美國人發明的。作爲一個可以計算、存儲、通信的複雜玩意,最最基本的功能,應該是能讀懂人類讓它乾的事情。所以呢,我們得構造一個計算機能用的語言,這個語言計算機能看懂,人也能看懂,這樣才能交流嘛。

計算機所用的語言是什麼呢?這個語言非常簡單,只有0和1兩種表示。0代表否,1代表是。通過0和1的各種組合,以及0和1之間的各種運算(位運算),計算機就能進行理解、分析這個世界,並幫助人類完成工作了。

但是0和1太簡單了,簡單到任何一個簡單的數字都可能用一長串0和1來表示。舉了例子,如果讓計算機記住1000這個數,計算機就要記住11,1110,1000這麼長一串數字。計算機倒是好記,但是人類記不住啊… 有沒有一種方法,能夠讓計算機表示的數據短一點,好記一點呢?

Hex就是最簡單的方法了。人類習慣於使用十進制,畢竟人類有是個手指,十個一進位,挺好的!計算機本質上是二進制,就0和1兩種數字的表示方法,所有其他可以直接轉換的表示方法中,進制只能有2這個數,不能有其他的數字。比如4,8,16就沒問題。其他的數字,不管怎麼折騰,轉換後也得是2^n形式。

想讓人類和計算機都能接受表示形式,8進制和16進制都是可以接受的。8進制的話,只使用0-7折8個數字就好了。16進制,光用數字是不夠了,還得用用其他的字符。然而,計算機畢竟是美國人發明的,他們覺得,乾脆,就16進制:用0-9表示前10個數,後面的用A、B、C、D、E、F表示,不區分大小寫。這就是最簡單的Hex編碼了。

Hex的編碼原理是:把一長串二進制數每4個分一組,如果位數不夠就在高位補0。4位數字一共只有16種情況,分別用0-9,A-F表示這16種情況。編碼表類似這樣:

<img src="https://pic1.zhimg.com/50/c9348ddba6c959f5421d1b22ebd5e05b_hd.jpg" data-rawwidth="289" data-rawheight="163" class="content_image" width="289">
==============================
2 要讓可讀性更強:ASCII碼
Hex編碼雖然好,但有個問題:從計算機上打開個文件,滿眼的十六進制數,很頭大啊… 十六進制還是不太好表示文本。能不能創建一種方法,能表示鍵盤打出來的全部英文字符、符號呢?鍵盤打不出來的字符,比如什麼回車啦,佔位啦,用特殊的符號表示。這樣一來,打開一個文件,滿眼英文,豈不是很爽快…

美國作爲計算機的始祖國家,自然要推出一個這樣的標準代碼表。這就是美國信息交換標準代碼,簡稱ASCII碼錶。這個碼錶包括了數字、英文大小寫、符號、以及各種各樣的轉義字符,可以包含英文所用的全部功能。很快地,ASCII碼稱爲了國際標準,現在大家知道的編碼形式,都是與ASCII碼兼容的。(圖片來自:美國信息交換標準代碼

<img src="https://pic4.zhimg.com/50/a6bb1edb442b7f46488671e81102864e_hd.jpg" data-rawwidth="635" data-rawheight="576" class="origin_image zh-lightbox-thumb" width="635" data-original="https://pic4.zhimg.com/a6bb1edb442b7f46488671e81102864e_r.jpg">
==============================
3 別的語言怎麼辦?UTF-8等其他編碼方法

這個碼錶一出來,英語國家開心了…其他國家的腦袋疼了… 帶註音的符號怎麼辦?日語韓語怎麼辦?最爲博大精深的中文怎麼辦… 於是,各個國家也推出了本國語言的編碼表。但是,爲了能在計算機系統中通用,這些編碼表基本都與ASCII碼兼容。

最爲知名的就是UTF-8了。這個編碼又稱爲萬國碼,顧名思義,就是支持包括中文簡體、中文繁體、日語、韓語等各種語言的編碼。這玩意太複雜了… 我就不細說了。

==============================
4 用一種編碼形式打開另一種編碼形式 會怎樣?

既然每個國家都有自己的編碼表了,問題也就來了。現在都國際化了,我要用一個支持本國語言的編碼系統,打開另一個編碼系統編碼的文本,會出現什麼情況呢?這就是亂碼了… 更爲嚴重的是,隨着互聯網的出現,各個國家的電腦都需要通信,而通信的一種方式就是使用URL地址。每個國家都希望把這個地址寫成自己國家的語言。但這會導致其他國家根本沒法訪問地址,因爲打不出這個字符嘛。所以,人類迫切需要一種中間編碼形式,既能夠兼容ASCII碼,又能夠把任意一種編碼形式轉換成只使用可讀字符就能表示的編碼。其中一種編碼形式,就是Base64編碼。

Base64編碼,顧名思義,用64個可讀字符進行編碼。與Hex的16個字符相比多了很多,但是比ASCII碼又少了一倍,去除了不可讀字符。標準Base64編碼中,這些字符是:
  • 數字:0,1,2,3,4,5,6,7,8,9,共10個
  • 小寫字母:a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,共26個
  • 大寫字母:A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,共26個
  • 加好+以及斜槓/

有的時候,根據不同的需要,Base64還有很多變種。比如,如果瀏覽器地址中用“+”和“/”的話,瀏覽器會將其轉換爲%XX的形式,又多了一步。因此可以將“+”和“/”換成“-”和“_”。

這種編碼形式長度也短,效率也高。這樣一來,數據通信的時候,不管來的是什麼語言,都轉化成Base64後再發送和接收。要是別國地址什麼的打不出來,就直接打Base64編碼形式就好了。如果細心的話,會發現百度雲盤共享的時候,用的就是Base64。舉個例子,前幾天有個朋友給我發送一個視頻,給的鏈接是這樣的(後面四位略去):
http://pan.baidu.com/s/1gdH**** 

前面都是標準的網頁形式,最後那個子文件,就是用Base64編碼的,而且可以在任何通信工具中傳遞,方便快捷啊。

==============================
5 誤區:Base64不是加密算法

很多博客什麼的都把Base64當做加密算法,這是不對的。Base64不具有可讀性,但不代表這個編碼是加密的。加密需要保證,沒有密鑰的人無法解密信息,無法從密文中獲得任何明文信息。Base64編碼顯然沒有密鑰什麼事… 所以,這個誤區大家要糾正過來。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章