一文详解 Base64编码原理

简介: Base64 是一种 编码方式,最早出现在电子邮件传输协议中。电子邮件问世之初,传递消息时只支持 ASCII 字符,后来随着电子邮件的广泛使用,传递非ASCII字符内容的需求增加,例如:传输中文、传输文件(图片、视频)。

最近在看Android的签名与验签机制,其中涉及到 MD5、SHA2、SHA256 等摘要算法,也涉及到 Base64 编码机制。这里先从简单的入手,记录一下 Base64 编码机制的原理。

一、Base64由来

Base64 是一种编码方式,最早出现在电子邮件传输协议中。
电子邮件问世之初,传递消息时只支持 ASCII 字符,后来随着电子邮件的广泛使用,传递非ASCII字符内容的需求增加,例如:传输中文、传输文件(图片、视频)。
为解决这一问题,最好的方案是在不改变传输协议的基础上,做一种扩展方案来支持非ASCII内容传输把非 ASCII 字符用ASCII来表示,Base64编码应运而生。

Base64由来

二、Base64定义

Base64 是一种基于64个 ASCII 字符来表示二进制数据的表示方法
Base64 将8比特位为一个单元的字节数据拆分为以6个比特位为一个单元的二进制片段,每6个比特位单元对应Base64索引表中的一个字符,这样最终构成一个超过编码前字节数据33%的字符串。

Base64 中64个可打印字符包括字母A-Za-z、数字0-9,此外还有两个字符为+和/,这样构成了共有64字符的Base64索引表

Base64索引表

三、Base64编码原理

Base64 将8比特位为一个单元的字节数据拆分为以6个比特位为一个单元的二进制片段;每6个比特位单元对应Base64索引表中的一个字符
按照以上方式可以算出base64编码后的字符串大约比编码前增加了33%

举例如下:
编码 Man 的Base64结果为TWFu,Base64编码计算过程如下:

文      本:M        a        n
ASCII 编码:77       97       110
8bit  字节:01001101 01100001 01101110
6bit  字节:010011 010110 000101 101110
Base64索引:19     22     5      46
Base64编码:T      W      F      u

为什么一些Base64后的字符中末尾有“==”

以上举例中:
编码前字节数正好被3整除,转化为二进制ASCII 编码3*8=24 )后,正好可以被6整除
编码前字节数不能被3整除,最后会余出1个或2个字节,那么编码时需要:

  • 使用 000000 字节值在末尾补足,使其字节数能够被3整除;
  • 编码时补位的6个比特位单元= 表示。

举例如下:
编码 Lucy 的Base64结果为THVjeQ==,Base64编码计算过程如下:

文      本:L        u        c        y
ASCII 编码:76       117      99       121
8bit  字节:01001100 01110101 01100011 01111001 (补)00000000 (补)00000000
6bit  字节:010011 000111 010101 100011 011110 010000 000000 000000
Base64索引:19     7      21     35     30     16     (补位)  (补位)
Base64编码:T      H      V      j      e      Q      =      =

由于Lucy只有4个字母,所以按3个一组的话,第二组还有两个空位。所以需要用00000000来补位,这里就需要注意,因为是需要补齐而出现的0,转化成十进制的时候就不能按常规用base64编码表来对应,所以不是A,编码后对应 “=” 。

参考

维基百科 Email:
https://en.wikipedia.org/wiki/Email

Content-Transfer-Encoding:
https://www.jianshu.com/p/7e0c2d078745

Base64 Data Encodings:
https://datatracker.ietf.org/doc/html/rfc4648

= THE END =

文章首发于公众号”CODING技术小馆“,如果文章对您有帮助,可关注我的公众号。

目录
相关文章
|
7天前
|
存储 前端开发 JavaScript
深入探讨Base64编码
深入探讨Base64编码
|
4天前
|
存储 前端开发 数据安全/隐私保护
Base64详解:从编码原理到应用实践
Base64详解:从编码原理到应用实践
|
1月前
|
存储 安全 数据安全/隐私保护
Base64编码的优缺点
Base64 是一种常用于将二进制数据编码为 ASCII 字符串的编码方法。下面是 Base64 编码的一些优点和缺点: ### 优点: 1. **可读性**:Base64 编码后的数据是纯文本形式的,这使得它可以轻松地在各种文本传输协议和环境中传输,而不会被误解或破坏。 2. **平台无关性**:Base64 编码是基于 ASCII 字符集的,这使得它在几乎所有的操作系统和编程语言中都是可用的。 3. **数据完整性**:Base64 可以确保数据的完整性,因为它是基于 ASCII 字符进行传输的,不会受到二进制数据在不同系统中解释方式的影响。 4. **简单易用**:许多编程语言
|
9月前
|
Java API 索引
一文读懂Base64编码
一文读懂Base64编码
62 0
|
10月前
|
存储 缓存 算法
图片转为base64格式的优缺点分析
图片转为base64格式的优缺点分析
400 0
|
10月前
|
数据采集 算法 安全
Base64 编码原理 && 实现
Base64 编码原理 && 实现
|
存储 数据库 索引
深入浅出理解base编码
深入浅出理解base编码
180 0
深入浅出理解base编码
|
API 语音技术 Python
Python 技术篇-用base64库对音频、图片等文件进行base64编码和解码实例演示
Python 技术篇-用base64库对音频、图片等文件进行base64编码和解码实例演示
923 0
Python 技术篇-用base64库对音频、图片等文件进行base64编码和解码实例演示
|
XML 存储 JSON
基础知识 - 为什么要使用 Base64 编码,有哪些情景需求?
基础知识 - 为什么要使用 Base64 编码,有哪些情景需求?
344 0
|
算法 区块链 索引
【密码学】Base64 编码 ( Base64 简介 | Base64 编码原理 | 最后编码组字节不足时补位 ‘=‘ 符号 | Base64 编码实现参考 )(一)
【密码学】Base64 编码 ( Base64 简介 | Base64 编码原理 | 最后编码组字节不足时补位 ‘=‘ 符号 | Base64 编码实现参考 )(一)
365 0
【密码学】Base64 编码 ( Base64 简介 | Base64 编码原理 | 最后编码组字节不足时补位 ‘=‘ 符号 | Base64 编码实现参考 )(一)