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

目录
  • 前言
  • Go Base64编码
  • 什么是Base64编码
  • 为什么需要Base64编码
  • Base64编码原理
    • 编码步骤
    • 位数不足情况
  • Base64解码原理
  • 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个阿拉伯数字、'+‘号 和 ‘/‘号。(其实还有一个 ‘=’ 号用于后缀)

编码步骤

由于一共有 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’

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

位数不足情况

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

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

如果是一个字节,也就是8个比特,需要补4个0,得到两个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编码内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Go语言实现Base64、Base58编码与解码

    目录 1. 常见的编码 2. go语言实现base64的编码与解码 2.1 Base64编码原理 2.2 实现Base64的编码与解码 3. go语言实现base58编码与解码 3.1 base58的编码过程 3.2 base58编解码具体实现 4. 最后 1. 常见的编码 base64:26个小写字母.26个大写字母.10个数字./.+ base58(区块链):去掉6个容易混淆的,去掉0,大写的O.大写的I.小写的L./.+/.+影响双击选择 2. go语言实现base64的编码与解码 2.1

  • go语言实现字符串base64编码的方法

    本文实例讲述了go语言实现字符串base64编码的方法.分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: package main import (     "fmt"     "encoding/base64" ) func main() { var b bytes.Buffer w := base64.NewEncoder(base64.URLEncoding, &b) w.Write(data) w.Close() data := b.B

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

    目录 前言 Go Base64编码 什么是Base64编码 为什么需要Base64编码 Base64编码原理 编码步骤 位数不足情况 Base64解码原理 Base64标准编码变种 总结 前言 在网络中传递参数时,我们经常会对参数进行Base64编码,那么Go 语言中如何进行Base64编码呢?Base64编码的原理是怎样的呢?通过这篇文章一起来了解下吧! Go Base64编码 标准Base64编码 // 标准Base64编码     src := "hello world"   

  • java中Base64编码原理实例讲解

    什么是 Base64 编码 Base64 编码是最常见的编码方式,基于 64 个可打印字符来表示任意二进制数据的方法,是从二进制转换到可见字符的过程. 使用场景 数据加密或签名通过 Base64 转换为字符串存储或传输. 不能传输文件的网络环境可以转换 Base64 进行网络传输. 在文本资源(如 HTML 和 CSS文件)中嵌入图片文件或其他二进制资源. 在 URL.网页中传输少量二进制数据等等. Base64 编码原理 原理是把每 3 个字节(每个字节为 8 位, 3 个字节为 24 位)重

  • 详解Go语言中Goroutine退出机制的原理及使用

    目录 退出方式 进程/main函数退出 通过channel退出 通过context退出 通过Panic退出 等待自己退出 阻止goroutine退出的方法 通过sync.WaitGroup 通过channel 封装 总结 goroutine是Go语言提供的语言级别的轻量级线程,在我们需要使用并发时,我们只需要通过 go 关键字来开启 goroutine 即可.作为Go语言中的最大特色之一,goroutine在日常的工作学习中被大量使用着,但是对于它的调度处理,尤其是goroutine的退出时机和

  • 一文讲清base64编码原理

    目录 前言 base64 由来 base64 的编码原理 base64 编码对照表 base64 的编码转换规则 base64 优缺点 JavaScript 的 base64 转码方法 Web API 二进制与 base64 转换 base64 转二进制 base64 转成 Blob 相关文献 前言 平静之下,蓦然回首,base64 却在灯火阑珊处. 今天翻开旧项目发现挺多图片相关的插件都是用 base64 来显示图片的.谈到 base64,脑海遐想翩翩,思绪回荡之下 base64 瑕瑜互见.本

  • Go语言中log日志库的介绍

    一.标准库log介绍 Go语言内置的log包实现了简单的日志服务. 1.使用Logger log包定义了Logger类型,该类型提供了一些格式化输出的方法. log包也提供了一个预定义的"标准"logger,可以通过调用函数Print系列(Print|Printf|Println).Fatal系列(Fatal|Fatalf|Fatalln).和Panic系列(Panic|Panicf|Panicln)来使用,比自行创建一个logger对象更容易使用. logger会打印每条日志信息的日

  • C语言中while与do-while的介绍与注意事项

    一.while和do-while的简介  1). while语句  语法: while(表达式){ 循环体; } 循环过程: 1.先判断表达式,是否为真,如果为真跳转到2,否则跳转到3 2.执行循环体,执行完毕,跳转到1 3.跳出循环 2). do-while语句 语法: do{ 循环体; }while(表达式);  注意:这个while后面的小括号必须接; 循环过程: 1.先执行循环体,执行完毕跳转到2 2.判断表达式的结果是否为真,如果为真,跳转到1,否则跳转到3 3.跳出循环 3). do

  • 关于base64编码的原理及实现方法分享

    一.Base64编码原理 步骤1:将所有字符转化为ASCII码:步骤2:将ASCII码转化为8位二进制:步骤3:将二进制3个归成一组(不足3个在后边补0)共24位,再拆分成4组,每组6位:步骤4:统一在6位二进制前补两个0凑足8位:步骤5:将补0后的二进制转为十进制:步骤6:从Base64编码表获取十进制对应的Base64编码: 说明:不足3个补0的最终Base64编码为=,而不是A! 二.Base64编码示例 示例一:zyq对应Base64编码为enlx 示例二:mzwu对应Base64编码为

  • Base64编码解码原理及C#编程实例

    一. Base64编码由来 为什么会有Base64编码呢?因为有些网络传送渠道并不支持所有的字节,例如传统的邮件只支持可见字符的传送,像ASCII码的控制字符就不能通过邮件传送.这样用途就受到了很大的限制,比如图片二进制流的每个字节不可能全部是可见字符,所以就传送不了.最好的方法就是在不改变传统协议的情况下,做一种扩展方案来支持二进制文件的传送.把不可打印的字符也能用可打印字符来表示,问题就解决了.Base64编码应运而生,Base64就是一种基于64个可打印字符来表示二进制数据的表示方法. 二

  • Python将内容进行base64编码与解码实现

    目录 一.需求说明 二.base64简介 三.base64编码解码 3.1.Python中base64编码解码 3.2.Python使用示例 一.需求说明 需要使用Python实现将内容转为base64编码,解码,方便后续的数据操作. 二.base64简介 Base64是一种二进制到文本的编码方式[是一种基于 64 个可打印字符来表示二进制数据的表示方法(由于 2^6=64,所以每 6 个比特为一个单元,对应某个可打印字符.3 个字节有 24 个比特(3*8),对应于 4 个 Base64 单元

  • node.js学习之base64编码解码

    一. Base64编码由来 为什么会有Base64编码呢?因为有些网络传送渠道并不支持所有的字节,例如传统的邮件只支持可见字符的传送,像ASCII码的控制字符就 不能通过邮件传送.这样用途就受到了很大的限制,比如图片二进制流的每个字节不可能全部是可见字符,所以就传送不了.最好的方法就是在不改变传统协议的情 况下,做一种扩展方案来支持二进制文件的传送.把不可打印的字符也能用可打印字符来表示,问题就解决了.Base64编码应运而生,Base64就是一种 基于64个可打印字符来表示二进制数据的表示方法

随机推荐