中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Go語言中的Base64編碼原理以及使用是怎樣的

發布時間:2022-01-26 11:48:45 來源:億速云 閱讀:703 作者:柒染 欄目:開發技術

今天就跟大家聊聊有關Go語言中的Base64編碼原理以及使用是怎樣的,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。

    前言

    在網絡中傳遞參數時,我們經常會對參數進行Base64編碼,那么Go 語言中如何進行Base64編碼呢?Base64編碼的原理是怎樣的呢?

    Go Base64編碼

    標準Base64編碼

    // 標準Base64編碼
        src := "hello world"
        res := base64.StdEncoding.EncodeToString([]byte(src))
        fmt.Println(res) // aGVsbG8gd29ybGQ=
    
        // 標準Base64解碼
        s, err := base64.StdEncoding.DecodeString(res)
        fmt.Println(string(s), err) // hello world <nil>

    Base64 URL 編碼

    標準Base64編碼后會有 &lsquo;+&lsquo;號,在HTTP URL傳輸時,'+&lsquo;號會被解析成空格,這樣服務端接收到的數據和傳輸的數據就不一致。因此衍生出了Base64 URL編碼,這種編碼會把&rsquo;+&lsquo;變為&rsquo;-',便于在URL中傳輸。

    因此如果想要將編碼后的數據放在 HTTP URL中傳輸,應該使用該編碼方式。

    // Base64 URL 編碼
    	src := "信息"
    	res := base64.URLEncoding.EncodeToString([]byte(src))
    	fmt.Println(res) // 5L-h6oGv
    
    	// Base64 URL 解碼
    	s, err := base64.URLEncoding.DecodeString(res)
    	fmt.Println(string(s), err) // 信息 <nil>

    什么是Base64編碼

    Base64是網絡上最常見的用于傳輸8Bit字節碼的編碼方式之一,是一種基于64個可打印字符來表示二進制數據的方法。Base64編碼是從二進制到字符的過程,可用于在HTTP環境下傳遞較長的標識信息。采用Base64編碼具有不可讀性,需要解碼后才能閱讀。&mdash;百度百科

    通過百度百科的介紹,我們可以獲得如下信息:

    • Base64是一種編碼方式,將二進制編碼為字符

    • Base64編碼后的字符范圍為64個可打印字符

    • 編碼后的結果具有不可讀性,需要解碼:即Base64不是加密方法,而是編碼方式,是從一種語言翻譯為另一種語言,當然也可以翻譯回去

    為什么需要Base64編碼

    我們都知道計算機的世界,是由0和1組成的,那么0和1的組合如何表示現實語言呢,這就出現了ASCII 碼。ASCII 是由美國設計的,一共128個字符,其中規定了第0~31及127(共33個)是控制字符或通信專用字符,32~126(共95個)是可打印字符。比如10(0000 1001)表示換行,65(0100 0001)表示大寫字母A。

    最初的許多協議都是基于 ASCII 設計的,只能傳輸可打印字符。比如發郵件時使用的 SMTP(簡單郵件傳輸協議),最初只能傳輸純文本,對圖片、語音等二進制文件的支持并不是太好。

    那么我們想傳輸這些包含不可打印字符的數據怎么辦,一種方式就是設計一種編碼方式,將不可打印字符轉為可打印字符,這樣這些數據就可以傳輸了,收到這些數據后,再解碼回來,得到原始數據。Base64就是為了解決這個問題的。

    對于現在的協議來說,都針對二進制文件做了處理,但我們無法保證文件在網絡傳輸過程中不出現問題。當包含不可打印字符的文件在網絡中傳輸時,往往要經過多個路由設備,由于不同的設備(特指老的路由設備)對字節流的處理方式有一些不同,這樣那些不可打印字節就有可能被錯誤處理,不利于數據傳輸的。所以就先把數據先做一個編碼,統統變成可見字節,確保數據可靠傳輸。

    Base64編碼原理

    Base64之所以叫做Base64,是因為它是基于64個可打印字符設計的,這64個字符是 ASCII 編碼中可打印字符的子集,包含26個字母的大小寫、10個阿拉伯數字、'+&lsquo;號 和 &lsquo;/&lsquo;號。(其實還有一個 &lsquo;=&rsquo; 號用于后綴)

    Go語言中的Base64編碼原理以及使用是怎樣的

    編碼步驟

    由于一共有 64 個字符,那么使用 6 個比特位就足夠表示了(2的6次方=64),而 ASCII碼 使用 8 個比特位表示一個字符,6 和 8 的最小公倍數為 24,3個 ASCII碼 字符可以編碼為 4 個 Base64 字符。因此Base64的編碼過程如下:

    1. 將原始數據每三個字節分為一組,一共24個比特位

    2. 將24個比特位分為4組,每組6個比特位

    3. 計算每組的十進制值,根據編碼對照表,得到可打印字符串

    以維基百科上舉的例子做個演示:

    1. 給定單詞 &lsquo;Man&rsquo;,一共三個字節

    2. 根據ASCII編碼,得到24個比特位

    3. 6個一組,分為4組

    4. 計算每組的十進制值分別為 19、22、5、46,對照Base64編碼表,得到可打印字符串為 &lsquo;TWFu&rsquo;

    Go語言中的Base64編碼原理以及使用是怎樣的

    需要注意的是,使用Base64編碼后,3個字節會轉為4個字節,編碼后的需要傳輸的數據比編碼前多了 1/3。

    位數不足情況

    位數不足會有兩種情況:兩個字節或者一個字節的數據。

    如果是兩個字節,也就是16個比特,需要補兩個0,得到三個Base64編碼字符,最后添加一個&rsquo;=&lsquo;用于補充

    Go語言中的Base64編碼原理以及使用是怎樣的

    如果是一個字節,也就是8個比特,需要補4個0,得到兩個Base64編碼字符,最后添加兩個&rsquo;=&lsquo;用于補充

    Go語言中的Base64編碼原理以及使用是怎樣的

    Base64解碼原理

    解碼就是編碼的逆向操作:

    1. 去掉結尾的&rsquo;=&lsquo;號

    2. 根據Base64編碼表,找到每個字符對應的編碼值

    3. 取每個編碼值的后6位,形成二進制串

    4. 對上述二進制串,每8個構成一個字節,如果最后一組不夠8個,一定全是0,丟棄掉

    5. 此時得到的就是原始數據的二進制編碼,再根據編碼方式(例如 ASCII )等進行解碼

    例如對于上述 &lsquo;Ma&rsquo; 的編碼值 &lsquo;TWE=&rsquo; 進行解碼:

    1. 去掉&rsquo;=',得到 &lsquo;TWE&rsquo;

    2. &lsquo;T&rsquo;:19,&lsquo;W&rsquo;:22,&lsquo;E&rsquo;:4

    3. 010011 010110 000100

    4. 01001101 01100001

    5. M a

    Base64標準編碼變種

    我們有時候會將Base64編碼后的字符串,當前 HTTP URL 中的參數進行傳遞,但是標準的 Base64 并不適合直接放在URL里傳輸,因為對于 &lsquo;+&lsquo;號,使用url encode時會被encode 為空格,比如編碼后的值是 &lsquo;ab+cd&rsquo;,但是使用url encode 后變成了 &lsquo;ab cd&rsquo;,那么對方接收到的也是&rsquo;ab cd&rsquo;,此時再解碼肯定失敗了。

    為解決此問題,衍生出一種用于URL的改進Base64編碼,它不僅在末尾去掉填充的&rsquo;=&lsquo;號,并將標準Base64中的“+”和“/”分別改成了“-”和“_”。

    看完上述內容,你們對Go語言中的Base64編碼原理以及使用是怎樣的有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    望城县| 玉林市| 库车县| 安新县| 高台县| 济源市| 长治县| 祁阳县| 法库县| 自贡市| 阿克陶县| 阿城市| 宜昌市| 城步| 大名县| 乐清市| 樟树市| 蓬莱市| 清远市| 正阳县| 通化县| 乌海市| 特克斯县| 呈贡县| 汤阴县| 根河市| 寿阳县| 合作市| 梁平县| 靖江市| 达尔| 沾化县| 门头沟区| 合水县| 武强县| 安龙县| 左云县| 卫辉市| 江津市| 绿春县| 育儿|