最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Go語(yǔ)言中的Base64編碼原理介紹以及使用

 更新時(shí)間:2022年01月26日 09:51:47   作者:漫漫Coding路  
Base64是網(wǎng)絡(luò)上最常見(jiàn)的用于傳輸8Bit字節(jié)代碼的編碼方式之一,可用于在HTTP環(huán)境下傳遞較長(zhǎng)的標(biāo)識(shí)信息,下面這篇文章主要給大家介紹了關(guān)于Go語(yǔ)言中的Base64編碼原理介紹以及使用的相關(guān)資料,需要的朋友可以參考下

前言

在網(wǎng)絡(luò)中傳遞參數(shù)時(shí),我們經(jīng)常會(huì)對(duì)參數(shù)進(jìn)行Base64編碼,那么Go 語(yǔ)言中如何進(jìn)行Base64編碼呢?Base64編碼的原理是怎樣的呢?通過(guò)這篇文章一起來(lái)了解下吧!

Go Base64編碼

標(biāo)準(zhǔn)Base64編碼

// 標(biāo)準(zhǔn)Base64編碼
?? ?src := "hello world"
?? ?res := base64.StdEncoding.EncodeToString([]byte(src))
?? ?fmt.Println(res) // aGVsbG8gd29ybGQ=

?? ?// 標(biāo)準(zhǔn)Base64解碼
?? ?s, err := base64.StdEncoding.DecodeString(res)
?? ?fmt.Println(string(s), err) // hello world <nil>

Base64 URL 編碼

標(biāo)準(zhǔn)Base64編碼后會(huì)有 ‘+‘號(hào),在HTTP URL傳輸時(shí),'+‘號(hào)會(huì)被解析成空格,這樣服務(wù)端接收到的數(shù)據(jù)和傳輸?shù)臄?shù)據(jù)就不一致。因此衍生出了Base64 URL編碼,這種編碼會(huì)把’+‘變?yōu)?rsquo;-',便于在URL中傳輸。

因此如果想要將編碼后的數(shù)據(jù)放在 HTTP URL中傳輸,應(yīng)該使用該編碼方式。

// Base64 URL 編碼
	src := "信息"
	res := base64.URLEncoding.EncodeToString([]byte(src))
	fmt.Println(res) // 5L-h5oGv

	// Base64 URL 解碼
	s, err := base64.URLEncoding.DecodeString(res)
	fmt.Println(string(s), err) // 信息 <nil>

什么是Base64編碼

Base64是網(wǎng)絡(luò)上最常見(jiàn)的用于傳輸8Bit字節(jié)碼的編碼方式之一,是一種基于64個(gè)可打印字符來(lái)表示二進(jìn)制數(shù)據(jù)的方法。Base64編碼是從二進(jìn)制到字符的過(guò)程,可用于在HTTP環(huán)境下傳遞較長(zhǎng)的標(biāo)識(shí)信息。采用Base64編碼具有不可讀性,需要解碼后才能閱讀。—百度百科

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

  • Base64是一種編碼方式,將二進(jìn)制編碼為字符
  • Base64編碼后的字符范圍為64個(gè)可打印字符
  • 編碼后的結(jié)果具有不可讀性,需要解碼:即Base64不是加密方法,而是編碼方式,是從一種語(yǔ)言翻譯為另一種語(yǔ)言,當(dāng)然也可以翻譯回去

為什么需要Base64編碼

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

最初的許多協(xié)議都是基于 ASCII 設(shè)計(jì)的,只能傳輸可打印字符。比如發(fā)郵件時(shí)使用的 SMTP(簡(jiǎn)單郵件傳輸協(xié)議),最初只能傳輸純文本,對(duì)圖片、語(yǔ)音等二進(jìn)制文件的支持并不是太好。

那么我們想傳輸這些包含不可打印字符的數(shù)據(jù)怎么辦,一種方式就是設(shè)計(jì)一種編碼方式,將不可打印字符轉(zhuǎn)為可打印字符,這樣這些數(shù)據(jù)就可以傳輸了,收到這些數(shù)據(jù)后,再解碼回來(lái),得到原始數(shù)據(jù)。Base64就是為了解決這個(gè)問(wèn)題的。

對(duì)于現(xiàn)在的協(xié)議來(lái)說(shuō),都針對(duì)二進(jìn)制文件做了處理,但我們無(wú)法保證文件在網(wǎng)絡(luò)傳輸過(guò)程中不出現(xiàn)問(wèn)題。當(dāng)包含不可打印字符的文件在網(wǎng)絡(luò)中傳輸時(shí),往往要經(jīng)過(guò)多個(gè)路由設(shè)備,由于不同的設(shè)備(特指老的路由設(shè)備)對(duì)字節(jié)流的處理方式有一些不同,這樣那些不可打印字節(jié)就有可能被錯(cuò)誤處理,不利于數(shù)據(jù)傳輸?shù)?。所以就先把?shù)據(jù)先做一個(gè)編碼,統(tǒng)統(tǒng)變成可見(jiàn)字節(jié),確保數(shù)據(jù)可靠傳輸。

Base64編碼原理

Base64之所以叫做Base64,是因?yàn)樗腔?4個(gè)可打印字符設(shè)計(jì)的,這64個(gè)字符是 ASCII 編碼中可打印字符的子集,包含26個(gè)字母的大小寫(xiě)、10個(gè)阿拉伯?dāng)?shù)字、'+‘號(hào) 和 ‘/‘號(hào)。(其實(shí)還有一個(gè) ‘=’ 號(hào)用于后綴)

編碼步驟

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

  1. 將原始數(shù)據(jù)每三個(gè)字節(jié)分為一組,一共24個(gè)比特位
  2. 將24個(gè)比特位分為4組,每組6個(gè)比特位
  3. 計(jì)算每組的十進(jìn)制值,根據(jù)編碼對(duì)照表,得到可打印字符串

以維基百科上舉的例子做個(gè)演示:

  1. 給定單詞 ‘Man’,一共三個(gè)字節(jié)
  2. 根據(jù)ASCII編碼,得到24個(gè)比特位
  3. 6個(gè)一組,分為4組
  4. 計(jì)算每組的十進(jìn)制值分別為 19、22、5、46,對(duì)照Base64編碼表,得到可打印字符串為 ‘TWFu’

需要注意的是,使用Base64編碼后,3個(gè)字節(jié)會(huì)轉(zhuǎn)為4個(gè)字節(jié),編碼后的需要傳輸?shù)臄?shù)據(jù)比編碼前多了 1/3。

位數(shù)不足情況

位數(shù)不足會(huì)有兩種情況:兩個(gè)字節(jié)或者一個(gè)字節(jié)的數(shù)據(jù)。

如果是兩個(gè)字節(jié),也就是16個(gè)比特,需要補(bǔ)兩個(gè)0,得到三個(gè)Base64編碼字符,最后添加一個(gè)’=‘用于補(bǔ)充

如果是一個(gè)字節(jié),也就是8個(gè)比特,需要補(bǔ)4個(gè)0,得到兩個(gè)Base64編碼字符,最后添加兩個(gè)’=‘用于補(bǔ)充

Base64解碼原理

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

  1. 去掉結(jié)尾的’=‘號(hào)
  2. 根據(jù)Base64編碼表,找到每個(gè)字符對(duì)應(yīng)的編碼值
  3. 取每個(gè)編碼值的后6位,形成二進(jìn)制串
  4. 對(duì)上述二進(jìn)制串,每8個(gè)構(gòu)成一個(gè)字節(jié),如果最后一組不夠8個(gè),一定全是0,丟棄掉
  5. 此時(shí)得到的就是原始數(shù)據(jù)的二進(jìn)制編碼,再根據(jù)編碼方式(例如 ASCII )等進(jìn)行解碼

例如對(duì)于上述 ‘Ma’ 的編碼值 ‘TWE=’ 進(jìn)行解碼:

  1. 去掉’=',得到 ‘TWE’
  2. ‘T’:19,‘W’:22,‘E’:4
  3. 010011 010110 000100
  4. 01001101 01100001
  5. M a

Base64標(biāo)準(zhǔn)編碼變種

我們有時(shí)候會(huì)將Base64編碼后的字符串,當(dāng)前 HTTP URL 中的參數(shù)進(jìn)行傳遞,但是標(biāo)準(zhǔn)的 Base64 并不適合直接放在URL里傳輸,因?yàn)閷?duì)于 ‘+‘號(hào),使用url encode時(shí)會(huì)被encode 為空格,比如編碼后的值是 ‘ab+cd’,但是使用url encode 后變成了 ‘ab cd’,那么對(duì)方接收到的也是’ab cd’,此時(shí)再解碼肯定失敗了。

為解決此問(wèn)題,衍生出一種用于URL的改進(jìn)Base64編碼,它不僅在末尾去掉填充的’=‘號(hào),并將標(biāo)準(zhǔn)Base64中的“+”和“/”分別改成了“-”和“_”。

總結(jié)

本篇文章,我們學(xué)習(xí)了如下內(nèi)容:

  1. Go 語(yǔ)言中如何進(jìn)行 Base64編碼
  2. Base64編碼和解碼原理
  3. Base64不是加密算法,而是一種編碼方式
  4. Base64編碼后的數(shù)據(jù)量是原數(shù)據(jù)大小的4/3左右

到此這篇關(guān)于Go語(yǔ)言中Base64編碼原理介紹以及使用的文章就介紹到這了,更多相關(guān)Go語(yǔ)言的Base64編碼內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • golang時(shí)間處理工具箱now的使用詳解

    golang時(shí)間處理工具箱now的使用詳解

    這篇文章主要介紹了golang時(shí)間處理工具箱now的使用詳解,幫助大家更好的理解和學(xué)習(xí)使用golang,感興趣的朋友可以了解下
    2021-02-02
  • Golang 使用map需要注意的幾個(gè)點(diǎn)

    Golang 使用map需要注意的幾個(gè)點(diǎn)

    這篇文章主要介紹了Golang 使用map需要注意的幾個(gè)點(diǎn),幫助大家更好的理解和學(xué)習(xí)golang,感興趣的朋友可以了解下
    2020-09-09
  • 詳解Golang函數(shù)式選項(xiàng)(Functional?Options)模式

    詳解Golang函數(shù)式選項(xiàng)(Functional?Options)模式

    什么是函數(shù)式選項(xiàng)模式,為什么要這么寫(xiě),這個(gè)編程模式解決了什么問(wèn)題呢?其實(shí)就是為了解決動(dòng)態(tài)靈活的配置不同的參數(shù)的問(wèn)題。下面通過(guò)本文給大家介紹Golang函數(shù)式選項(xiàng)(Functional?Options)模式的問(wèn)題,感興趣的朋友一起看看吧
    2021-12-12
  • Go 語(yǔ)言中程序編譯過(guò)程詳解

    Go 語(yǔ)言中程序編譯過(guò)程詳解

    本文旨在深入探討Go語(yǔ)言的編譯機(jī)制和最新的模塊管理系統(tǒng)——Go Modules,通過(guò)詳細(xì)的示例和步驟,我們將演示從簡(jiǎn)單的 “Hello World” 程序到使用第三方庫(kù)的更復(fù)雜項(xiàng)目的開(kāi)發(fā)過(guò)程,感興趣的朋友跟隨小編一起看看吧
    2024-05-05
  • golang簡(jiǎn)單讀寫(xiě)文件示例

    golang簡(jiǎn)單讀寫(xiě)文件示例

    這篇文章主要介紹了golang簡(jiǎn)單讀寫(xiě)文件的方法,實(shí)例分析了Go簡(jiǎn)單文件讀取與寫(xiě)入操作的相關(guān)技巧,需要的朋友可以參考下
    2016-07-07
  • 深入理解Golang?Channel?的底層結(jié)構(gòu)

    深入理解Golang?Channel?的底層結(jié)構(gòu)

    這篇文章主要介紹了深入理解Golang?Channel?的底層結(jié)構(gòu),Go?語(yǔ)言的?channel?底層是什么數(shù)據(jù)結(jié)構(gòu)?下面我們就一起來(lái)深入解析一下?channel,需要的朋友可以參考下
    2022-01-01
  • 解決 Golang VS Code 插件下載安裝失敗的問(wèn)題

    解決 Golang VS Code 插件下載安裝失敗的問(wèn)題

    這篇文章主要介紹了解決 Golang VS Code 插件下載安裝失敗,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-05-05
  • Go語(yǔ)言題解LeetCode888公平糖果交換示例詳解

    Go語(yǔ)言題解LeetCode888公平糖果交換示例詳解

    這篇文章主要為大家介紹了Go語(yǔ)言題解LeetCode888公平糖果交換示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • gin+gorm實(shí)現(xiàn)goweb項(xiàng)目的示例代碼

    gin+gorm實(shí)現(xiàn)goweb項(xiàng)目的示例代碼

    Gorm是Go語(yǔ)言的ORM框架,提供一套對(duì)數(shù)據(jù)庫(kù)進(jìn)行增刪改查的接口,本文主要介紹了gin+gorm實(shí)現(xiàn)goweb項(xiàng)目的示例代碼,具有一定的參考價(jià)值,感興趣的可以了解一下
    2025-03-03
  • Go語(yǔ)言實(shí)戰(zhàn)之詳細(xì)掌握正則表達(dá)式的應(yīng)用與技巧

    Go語(yǔ)言實(shí)戰(zhàn)之詳細(xì)掌握正則表達(dá)式的應(yīng)用與技巧

    正則表達(dá)式是一種從左到右與主題字符串匹配的模式,正則表達(dá)式用于替換字符串中的文本,驗(yàn)證表單,基于模式匹配從字符串中提取子字符串等等,這篇文章主要給大家介紹了關(guān)于Go語(yǔ)言實(shí)戰(zhàn)之詳細(xì)掌握正則表達(dá)式的應(yīng)用與技巧,需要的朋友可以參考下
    2023-12-12

最新評(píng)論

津市市| 昌乐县| 开鲁县| 霍邱县| 铅山县| 阿城市| 安溪县| 汤阴县| 象山县| 鄂尔多斯市| 萨迦县| 乾安县| 会理县| 承德县| 二连浩特市| 亚东县| 河西区| 新巴尔虎左旗| 绵竹市| 德阳市| 永泰县| 东源县| 兴宁市| 建湖县| 桓仁| 十堰市| 河北区| 南康市| 大厂| 平湖市| 平邑县| 平山县| 辽宁省| 廊坊市| 萍乡市| 石河子市| 德州市| 陵水| 长子县| 恭城| 周至县|