小工具      在线工具  汉语词典  css  js  c++  java

Go语言Base64编码原理及使用

go知识点杂烩,golang,go,Base64编码 额外说明

收录于:39天前

在网络中传递参数时,我们经常对参数进行Base64编码。那么Go语言中如何进行Base64编码呢? Base64编码的原理是什么?让我们通过这篇文章了解更多吧!

Go代码Base64编码(标准Base64编码、Base64 URL编码)

package main
 
import (
"encoding/base64"
"fmt"
)
 
func main() {
// 标准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
 
// Base64 URL 编码
src2 := "信息"
res2 :=base64.URLEncoding.EncodeToString([]byte(src2))
fmt.Println(res2) // 5L-h5oGv
 
// Base64 URL 解码
s2, err2 :=base64.URLEncoding.DecodeString(res2)
fmt.Println(string(s2), err2) // 信息 <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(00001001)代表换行,65(0100 0001)代表大写字母A。

最初的许多协议都是基于 ASCII 设计的,只能传输可打印字符。比如发邮件时使用的 邮件传输协议(简单邮件传输协议),最初只能传输纯文本,对图片、语音等二进制文件的支持并不是太好。

那么如果我们要传输这些含有不可打印字符的数据该怎么办呢?一种方法是设计一种编码方法,将不可打印的字符转换为可打印的字符,从而可以传输数据。接收到数据后,解码回来,得到原始数据。 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位

  1. 将 24 位分为 4 组,每组 6 位

  1. 根据编码对照表计算每组的十进制值并得到可打印的字符串

我们用维基百科的例子来进行演示:

  1. 给定单词“Man”,有三个字节

  1. 根据ASCII编码,得到24位

  1. 6人为一组,分为4组

  1. 计算每组的十进制值为19、22、5、46,并与Base64编码表进行比较,得到可打印字符串为‘TWFu’

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

数字不足

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

如果是两个字节,即16位,则需要添加两个0,得到三个Base64编码字符,最后添加一个‘=’进行补充

如果是字节,即8位,则需要添加4个0,得到两个Base64编码字符,最后添加两个‘=’进行补充

Base64解码原理

解码是编码的逆操作:

  1. 删除末尾的“=”号

  1. 根据Base64编码表找到每个字符对应的编码值

  1. 取每个编码值的最后6位,形成一个二进制字符串

  1. 对于上面的二进制串,每8位组成一个字节。如果最后一组小于8,则必须全部为0并丢弃。

  1. 此时得到的是原始数据的二进制编码,然后根据编码方式(如ASCII)等进行解码。

例如,解码上面‘Ma’的编码值‘TWE=’:

  1. 删除“=”并得到“TWE”

  1. ‘T’:19,‘W’:22,‘E’:4

  1. 010011 010110 000100

  1. 01001101 01100001

Base64 标准编码变体

我们有时会在当前的HTTP URL中传递Base64编码的字符串和参数,但是标准的Base64不适合直接在URL中传输,因为使用url Encode时'+'符号会被编码。空格,比如,编码值为'ab+cd',但是使用urlencode后就变成了'ab cd',那么对方就会收到'ab cd',这时候解码肯定会失败。

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

. . .

相关推荐

额外说明

nfs内核配置

1、配置网络部分,主要是使能CONFIG_IP_PNP以在2中能够看到Root file system on NFS选项 Networking support Networking options TCP/IP networking IP: kernel

额外说明

KeyCloak基础概念

  Users 是一种可以登录系统的实体,可以拥有一些属性,如email、username、address、phone number等, 可以加入组,成为组成员 可以分配角色 Authentication 识别和验证用户 Authorization 为用

额外说明

zk 搭建maven工程,建立curator与zkserver的连接

              创建客户端      

额外说明

Prompt learning 教学[技巧篇]:通过增加示例、引导词、特殊符号指令等方式让chatgpt输出更好的答案

Prompt learning 教学[技巧篇]:通过增加示例、引导词、特殊符号指令等方式让chatgpt输出更好的答案 技巧1:To Do and Not To Do 在问答场景里,为了让 AI 回答更加准确,一般会在问题里加条件。比如让 AI 推荐一部

额外说明

9.Python基础语法(六)【数据类型转换】

目录: Python基础语法(六) 15. Python数据类型转换 15.1 数值类型转换 15.2 tuple和list的相互转换 15.3 将List和Tuple复合数据类型转换为Dictionary 15.4 小知识点拓展 Python基础语法(

额外说明

Vert.x(vertx) 实现TCP服务

对于Java开发人员,想要实现一个http服务,非常简单,写个servlet,打成war包,放到tomcat下就能运行。但如果要实现一个tcp服务就没那么简单了,因为tcp是传输层协议,并不像http那样,有类似tomcat的中间件给我们封装底层的网络协

额外说明

富文本编辑器CKEditor 5开发环境搭建

CKEditor 5常见的使用方式有两种 传统方式,直接引用编译后的ckeditor.js 文件。详细使用可以参考: CKEditor快速介绍与入门示例 包的导入方式: 基于Node.js 和npm 导入CKEditor 5依赖包。 除了包的使用方式之外

额外说明

前端(二十)——Vite和Webpack:前端开发中常用的构建工具

-博主:小猫娃来啦 -文章核心:Vite和Webpack:前端开发中常用的构建工具 文章目录 前言 Vite简介 Webpack简介 对比分析 如何选择Vite或Webpack 小结 前言 前端开发中,构建工具起到了至关重要的作用,能够帮助开发者提高开发

额外说明

Installing APK 'app-debug.apk' on 'OPPO R9m - 5.1' for app:debug

手机:oppor9 Android 5.1 安装错误: Gradle 的编译版本过高, 不兼容部分5.0+手机, 需要降低版本为 1.3. 使用AndroidStudio安装的时候,IDE提供了app运行时需要的权限,所以直接使用Debug就可以安装。而

额外说明

解决mfc110.dll出现找不到缺少等问题

其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或者损坏了,这时你只需下载这个mfc110.dll文件进行安装(前提是找到适合的版本),当我

ads via 小工具