各種計算機編碼與base64

2022-07-26 18:06:19 字數 2669 閱讀 8534

什麼是base64,base64與hex編碼,ascii編碼,utf-8編碼都是什麼關係

1 計算機開始之初,二進位制

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

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

2 hex編碼:縮短書寫,變得稍微可接受

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種情況。

3 ascii碼:要讓可讀性更強

hex編碼雖然好,但有個問題:從計算機上開啟個檔案,滿眼的十六進製制數,很頭大啊… 十六進製制還是不太好表示文字。能不能建立一種方法,能表示鍵盤打出來的全部英文本元、符號呢?鍵盤打不出來的字元,比如什麼回車啦,佔位啦,用特殊的符號表示。這樣一來,開啟乙個檔案,滿眼英文,豈不是很爽快…

美國作為計算機的始祖國家,自然要推出乙個這樣的標準**表。這就是美國資訊交換標準**,簡稱ascii碼表。這個碼表包括了數字、英文大小寫、符號、以及各種各樣的轉義字元,可以包含英文所用的全部功能。很快地,ascii碼稱為了國際標準,現在大家知道的編碼形式,都是與ascii碼相容的。

4 utf-8:解決除英語之外其他語言

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

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

5 base64:多種編碼溝通的橋梁

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

base64編碼,顧名思義,用64個可讀字元進行編碼。與hex的16個字元相比多了很多,但是比ascii碼又少了一倍,去除了不可讀字元。標準base64編碼中,這些字元是:

這種編碼形式長度也短,效率也高。這樣一來,資料通訊的時候,不管來的是什麼語言,都轉化成base64後再傳送和接收。要是別國位址什麼的打不出來,就直接打base64編碼形式就好了。

base64演算法與各種編碼互動:比如 0100111100101010100011 這串二進位制,在utf-8裡表示的是 「我是誰」。如果你想把「我是誰」轉化成base64,你就要先把「我是誰」轉化成「0100111100101010100011」 這串二進位制(在utf-8碼表裡找對映),然後再把這串二進位制轉化成 「zg0abd12" 的base64 編碼。具體這串二進位制怎麼轉化成base64編碼的請看base64演算法。

base64演算法:base64要求把每三個8bit的位元組轉換為四個6bit的位元組(3*8 = 4*6 = 24),然後把6bit再添兩位高位0,組成四個8bit的位元組,也就是說,轉換後的字串理論上將要比原來的長1/3。這樣說會不會太抽象了?不怕,我們來看乙個例子:轉換前 aaaaaabb ccccdddd eeffffff

轉換後 00aaaaaa 00bbcccc 00ddddee 00ffffff

然後轉換後的二進位制對應base64碼表上面64個字元,進行替換就產生base64碼。

base64特點:1、速度非常快。3、長短也短。3、能夠將字串a轉換成字串b,而且如果你光看字串b,是絕對猜不出字串a的內容來的。

base64誤區:這種編碼形式長度也短,效率也高。這樣一來,資料通訊的時候,不管來的是什麼語言,都轉化成base64後再傳送和接收。要是別國位址什麼的打不出來,就直接打base64編碼形式就好了。

本文參考知乎問答

base64編碼 動畫演示 Base 64 編碼

base64 是一種十分流行的編碼方式,僅僅使用 64 個字元加等號 就可以以文字的形式表示所有的二進位制資料了,因為它能夠把二進位制格式通過編碼轉換成可見字元,所有我們就可以通過的把二進位制格式比如,檔案等通過 base64 編碼然後通過文字的形式共享出去,是不是很神奇呀。把輸入的資料轉換成 二進...

base64編碼長度計算

先看乙個來自牛客網的題目 在網路傳輸資料時,經常需要將二進位制資料轉換為乙個可列印字串。一般用到的可列印字元集合包含64個字元,因此又稱為base64表示法。現有乙個char陣列長度為12,要將它表示為base64字串,請問base64字串最少需要 個char 如果char陣列長度為20,則需要 個...

Base64編碼演算法

base64要求把每三個8bit的位元組轉換為四個6bit的位元組 3 8 4 6 24 然 後把6bit再添兩位高位0,組成四個8bit的位元組,也就是說,轉換後的字串理 論上將要比原來的長1 3。轉換後,我們用乙個碼表來得到我們想要的字串 也就是最終的base64編碼 這個表是這樣的 0 a 1...