脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服务器之家 - 脚本之家 - Golang - Go语言中的Base64编码原理介绍以及使用

Go语言中的Base64编码原理介绍以及使用

2022-09-01 09:38漫漫Coding路 Golang

Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,可用于在HTTP环境下传递较长的标识信息,下面这篇文章主要给大家介绍了关于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编码后会有 ‘+‘号,在HTTP URL传输时,'+‘号会被解析成空格,这样服务端接收到的数据和传输的数据就不一致。因此衍生出了Base64 URL编码,这种编码会把’+‘变为’-',便于在URL中传输。

因此如果想要将编码后的数据放在 HTTP URL中传输,应该使用该编码方式。

// 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是网络上最常见的用于传输8Bit字节码的编码方式之一,是一种基于64个可打印字符来表示二进制数据的方法。Base64编码是从二进制到字符的过程,可用于在HTTP环境下传递较长的标识信息。采用Base64编码具有不可读性,需要解码后才能阅读。—百度百科

通过百度百科的介绍,我们可以获得如下信息:

  • 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个阿拉伯数字、'+‘号 和 ‘/‘号。(其实还有一个 ‘=’ 号用于后缀)

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. 给定单词 ‘Man’,一共三个字节
  2. 根据ASCII编码,得到24个比特位
  3. 6个一组,分为4组
  4. 计算每组的十进制值分别为 19、22、5、46,对照Base64编码表,得到可打印字符串为 ‘TWFu’

Go语言中的Base64编码原理介绍以及使用

需要注意的是,使用Base64编码后,3个字节会转为4个字节,编码后的需要传输的数据比编码前多了 1/3。

 

位数不足情况

位数不足会有两种情况:两个字节或者一个字节的数据。

如果是两个字节,也就是16个比特,需要补两个0,得到三个Base64编码字符,最后添加一个’=‘用于补充

Go语言中的Base64编码原理介绍以及使用

如果是一个字节,也就是8个比特,需要补4个0,得到两个Base64编码字符,最后添加两个’=‘用于补充

Go语言中的Base64编码原理介绍以及使用

 

Base64解码原理

解码就是编码的逆向操作:

  1. 去掉结尾的’=‘号
  2. 根据Base64编码表,找到每个字符对应的编码值
  3. 取每个编码值的后6位,形成二进制串
  4. 对上述二进制串,每8个构成一个字节,如果最后一组不够8个,一定全是0,丢弃掉
  5. 此时得到的就是原始数据的二进制编码,再根据编码方式(例如 ASCII )等进行解码

例如对于上述 ‘Ma’ 的编码值 ‘TWE=’ 进行解码:

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

 

Base64标准编码变种

我们有时候会将Base64编码后的字符串,当前 HTTP URL 中的参数进行传递,但是标准的 Base64 并不适合直接放在URL里传输,因为对于 ‘+‘号,使用url encode时会被encode 为空格,比如编码后的值是 ‘ab+cd’,但是使用url encode 后变成了 ‘ab cd’,那么对方接收到的也是’ab cd’,此时再解码肯定失败了。

为解决此问题,衍生出一种用于URL的改进Base64编码,它不仅在末尾去掉填充的’=‘号,并将标准Base64中的“+”和“/”分别改成了“-”和“_”。

 

总结

本篇文章,我们学习了如下内容:

  1. Go 语言中如何进行 Base64编码
  2. Base64编码和解码原理
  3. Base64不是加密算法,而是一种编码方式
  4. Base64编码后的数据量是原数据大小的4/3左右

到此这篇关于Go语言中Base64编码原理介绍以及使用的文章就介绍到这了,更多相关Go语言的Base64编码内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://lifelmy.github.io/post/2022_01_16_go_base64/

延伸 · 阅读

精彩推荐
  • Golanggolang 如何自动下载所有依赖包

    golang 如何自动下载所有依赖包

    这篇文章主要介绍了golang 自动下载所有依赖包的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    landv13542021-06-10
  • GolangGO语言实现的端口扫描器分享

    GO语言实现的端口扫描器分享

    这篇文章主要介绍了GO语言实现的端口扫描器分享,本文直接给出实现代码,代码中包含大量注释,需要的朋友可以参考下 ...

    junjie12122020-04-10
  • Golang深入了解Go语言的基本语法与常用函数

    深入了解Go语言的基本语法与常用函数

    这篇文章主要为大家详细介绍一下Go语言中的基本语法与常用函数,文中的示例代码讲解详细,对我们学习Go语言有一定的帮助,需要的可以参考一下...

    哥德巴赫的猜想4672022-07-16
  • GolangGoLang之go build命令的具体使用

    GoLang之go build命令的具体使用

    本文主要介绍了GoLang之go build命令的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随...

    GoGo在努力6212022-08-17
  • GolangGO 使用Webhook 实现github 自动化部署的方法

    GO 使用Webhook 实现github 自动化部署的方法

    这篇文章主要介绍了GO 使用Webhook 实现github 自动化部署的方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值...

    周伯通的麦田5502020-07-09
  • GolangGolang的select多路复用及channel使用操作

    Golang的select多路复用及channel使用操作

    这篇文章主要介绍了Golang的select多路复用及channel使用操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    piperck14352021-03-14
  • Golang使用Golang的Context管理上下文的方法

    使用Golang的Context管理上下文的方法

    这篇文章主要介绍了使用Golang的Context管理上下文的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友...

    mingkai_beijing2602020-05-28
  • GolangGolang 中的 unsafe.Pointer 和 uintptr详解

    Golang 中的 unsafe.Pointer 和 uintptr详解

    这篇文章主要介绍了Golang中的unsafe.Pointer和uintptr详解,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的朋友可以参考一下...

    ag992011472022-08-05