BASE64编码概念

  Base64 是一种基于64个可打印字符来表示二进制数据的表示方法。在 Base64中可打印字符包括字母 A-Z, a-z, 数字 0-9,这样共有 62 个字符,另外两个可打印符号在不同的编码系统中不同。由于 2^6 = 64, 所以每 6 个比特为一个单元,对应某个可打印字符。比如:3 个字节(ASCII 表示)有 24 个比特,可由 4 个 Base64 编码的可打印字符来表示。

为什么要用 BASE64 编码

  BASE64编码会把 3 字节的二进制数据编码为 4 字节的文本数据,长度增加 33%,为什么我们还要用这种编码方式呢?好处就是编码后的文本数据可以在邮件正文、网页等直接显示。

代码调用

  在 golang 中提供了两种格式的数据供我们直接调用,用于实现 BASE64 的编码和解码:

// 来自 base64.go
const encodeStd = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
const encodeURL = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_"

  标准数据(encodeStr)可打印符号为:encodeStd 中的符号:

    msg := "Mac"
base64URLEncoding := base64.StdEncoding.EncodeToString(([]byte(msg)))
fmt.Println("Base64编码后:", base64URLEncoding)
// 解码
base64DecodeByte, err := base64.StdEncoding.DecodeString(base64URLEncoding)
if err != nil {
log.Panic(err)
}
fmt.Println("Base64解码后的字节数组:", base64DecodeByte)
fmt.Println("Base64解码后:", string(base64DecodeByte)) // 输出结果:

    Base64编码后: TWFj
    Base64解码后的字节数组: [77 97 99]
    Base64解码后: Mac

  URL数据(encodeURL) 可打印符号为:encodeURL 中的符号:

    msgUrl := "http://www.google.com"
base64UrlEncodedString := base64.URLEncoding.EncodeToString([]byte(msgUrl))
fmt.Println("Base64编码后:", base64UrlEncodedString)
base64UrlDecodedByte, err := base64.URLEncoding.DecodeString(base64UrlEncodedString)
if err != nil {
log.Panic(err)
}
fmt.Println("Base64解码后的字节数组:", base64UrlDecodedByte)
fmt.Println("Base64解码后:", string(base64UrlDecodedByte))   // 输出结果

    Base64编码后: aHR0cDovL3d3dy5nb29nbGUuY29t
    Base64解码后的字节数组: [104 116 116 112 58 47 47 119 119 119 46 103 111 111 103 108 101 46 99 111 109]
    Base64解码后: http://www.google.com

编码原理

step1: 将每个字符转成 ASCII 编码

msg := "Mac"
fmt.Println([]byte(msg)) // [77 97 99]

step2: 将 ASCII 转换成二进制编码

msg := "Mac"
fmt.Printf("%b\n", []byte(msg)) // [1001101 1100001 1100011]

补齐 8 位为:

[01001101 01100001 01100011]

step3: 将二进制编码按照 6位 一组进行平分

010011 010110 000101 100011

step4: 转换为十进制数:

010011--->19
010110--->22
000101--->5
100011--->35

step5: 将转换的十进制数作为索引,从 Base64 编码表中查找字符

索引              对应字符
0-->25 A---->Z
26-->51 a----->z
52-->61 0----->9
62 "+" or "-"
63 "/" or "_" // 上面 "MAC" BASE64 编码结果为 TWFj
19---> T
22---> W
5 ---> F
35---> j

注意

  BASE64 编码之后的结果总是 4 的整数倍,不够的需要在尾部补 “=” 符号

若文本为 3个字符, 则刚好编码为 4个 字符长度(3 * 8 = 4 * 6)

若文本为 2个字符, 则编码为 3个字符,尾部用一个 “=” 补齐

若文本为 1 个字符,则编码为 2个字符,尾部用两个 “=” 补齐

注:上表来自参考资料

参考资料:

https://blog.51cto.com/clovemfong/2160384

http://loveshisong.cn/%E7%BC%96%E7%A8%8B%E6%8A%80%E6%9C%AF/2017-11-11-Base64%E4%B8%8EURLEncode%E7%AE%80%E4%BB%8B.html

Golang---BASE64编码原理的更多相关文章

  1. BASE64编码原理分析脚本实现及逆向案例

    在互联网中的每一刻,你可能都在享受着Base64带来的便捷,但对于Base64的基础原理你又了解多少?今天小编带大家了解一下Base64编码原理分析脚本实现及逆向案例的相关内容.   01编码由来 数 ...

  2. Atitit.Base64编码原理与实现设计

    Atitit.Base64编码原理与实现设计 1. Base64编码1 1.1. 为什么要用自己的base64编码方案1 2. Base64编码由来1 3. Base64编码原理1 3.1. 具体来说 ...

  3. Base64编码原理及应用

    最近在做一个H5上传图片并压缩的项目,其过程主要是先将图片上传通过readAsDataURL获取上传图片base64编码,然后根据高宽比将图片画到canvas上实现压缩,在通过toDataURL获取压 ...

  4. Base64 编码原理

    什么是 Base64 编码 Base64 编码是最常见的编码方式,基于 64 个可打印字符来表示任意二进制数据的方法,是从二进制转换到可见字符的过程. 使用场景 数据加密或签名通过 Base64 转换 ...

  5. Base64编码原理分析

    Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,在了解Base64编码之前,先了解几个基本概念:位.字节. 位:"位(bit)"是计算机中最小的数据单位.每一位 ...

  6. Base64编码原理与应用

    本文内容转自网络,如需详细内容,请参考相关网址. http://my.oschina.net/goal/blog/201032 代码参考:http://blog.csdn.net/prsniper/a ...

  7. 一篇文章彻底弄懂Base64编码原理

    在互联网中的每一刻,你可能都在享受着Base64带来的便捷,但对于Base64的基础原理又了解多少?今天这篇博文带领大家了解一下Base64的底层实现. Base64的由来 目前Base64已经成为网 ...

  8. 一篇文章彻底弄懂Base64编码原理(转载)

    在互联网中的每一刻,你可能都在享受着Base64带来的便捷,但对于Base64的基础原理又了解多少?今天这篇博文带领大家了解一下Base64的底层实现. Base64的由来 目前Base64已经成为网 ...

  9. 知识扩展——(转)一篇文章彻底弄懂Base64编码原理

    在互联网中的每一刻,你可能都在享受着Base64带来的便捷,但对于Base64的基础原理又了解多少?今天这篇博文带领大家了解一下Base64的底层实现. 一.Base64的由来 目前Base64已经成 ...

  10. 一篇文章彻底搞懂base64编码原理

    开始 在互联网中的每一刻,你可能都在享受着Base64带来的便捷,但对于Base64的基础原理又了解多少?今天这篇文章带领大家了解一下Base64的底层实现. base64是什么东东呢? Base64 ...

随机推荐

  1. 51nod 1444:破坏道路 广度优先搜索

    1444 破坏道路 题目来源: CodeForces 基准时间限制:1.5 秒 空间限制:131072 KB 分值: 80 难度:5级算法题  收藏  取消关注 在某一个国家,那儿有n个城市,他们通过 ...

  2. Linux-Power-management

    1. 低级接口1.1 内核(swsusp)软件挂起1.1.1 睡眠状态的2个控制文件1.1.2 查看当前系统的睡眠控制文件内容1.1.3 状态表(表1)1.1.4 状态的使用1.2 uswsusp用户 ...

  3. ROS大型工程学习(四)一键安装所有缺失的依赖!!!

    在正文之前,我必须向rosdep道个歉,前面那篇常用命令行中没有它的位置,现在单独写一篇补充!! 突然发现rosdep有个惊人的功能, rosdep install --from-paths src ...

  4. Windows下 dmp文件的产生

    一.windows下的崩溃捕获windows程序当遇到异常,没有try-catch或者try-catch也无法捕获到的异常时,程序就会自动退出.windows系统默认是不产生程序dmp文件的.dump ...

  5. SNOI2019 选做

    施工中... d1t1 字符串 题面 考虑两个字符串 \(s_i,s_j(i<j)\) ,实质是 \(s[i+1,\dots j]\) 和 \(s[i,\dots ,j-1]\) 的字符串字典序 ...

  6. Unity 打开其他exe文件

    using UnityEngine; using System.Collections; using System.Diagnostics;///// public class FeiYuZhu : ...

  7. Mac 设置git的template

    1.在home目录下修改.gitconfig(没有新建) 2. 在home下新建 .setCommitMsg 文件 3.然后将一下内容复制到文件中 # <类型>: (类型的值见下面描述) ...

  8. ROS常用库(一) fake_localization

    wiki是最好的学习资料,以下直接参考了wiki官网.另外po出官网网址,建议英语较好的朋友之接看原版 http://wiki.ros.org/fake_localization 概述 fake_lo ...

  9. 054-for循环

    <?php for($i=1;$i<=5;$i++){ echo "$i<br />"; //循环体 } ?>

  10. Centos7.4 kafka集群安装与kafka-eagle1.3.9的安装

    Centos7.4 kafka集群安装与kafka-eagle1.3.9的安装 集群规划: hostname Zookeeper Kafka kafka-eagle kafka01 √ √ √ kaf ...