一文详解 Base64编码原理
最近在看Android的签名与验签机制,其中涉及到 MD5、SHA2、SHA256 等摘要算法,也涉及到 Base64 编码机制。这里先从简单的入手,记录一下 Base64 编码机制的原理。
一、Base64由来
Base64 是一种编码方式
,最早出现在电子邮件传输协议中。
电子邮件问世之初,传递消息时只支持 ASCII
字符,后来随着电子邮件的广泛使用,传递非ASCII字符
内容的需求增加,例如:传输中文、传输文件(图片、视频)。
为解决这一问题,最好的方案是在不改变传输协议的基础上,做一种扩展方案来支持非ASCII内容传输
,把非 ASCII 字符用ASCII来表示
,Base64编码应运而生。
二、Base64定义
Base64 是一种基于64个 ASCII 字符来表示二进制数据的表示方法
。
Base64 将8比特位为一个单元
的字节数据拆分为以6个比特位为一个单元
的二进制片段,每6个比特位单元
对应Base64索引表中的一个字符
,这样最终构成一个超过编码前字节数据33%的字符串。
Base64 中64个可打印字符包括字母A-Z
、a-z
、数字0-9
,此外还有两个字符为+和/
,这样构成了共有64字符的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 =
一文详解 Base64编码原理相关推荐
- 详解Base64编码和解码
Base64是最常用的编码之一,比如开发中用于传递参数.现代浏览器中的<img />标签直接通过Base64字符串来渲染图片以及用于邮件中等等.Base64编码在RFC2045中定义,它被 ...
- 一文轻松明白 Base64 编码原理
把图片丢进浏览器,打开sources能看到一长串字符串,这是图片的Base64编码.这一长串编码到底是怎么生成的呢? 我们接下来探索一下base64编码的原理 Base64 名称的由来 Base64编 ...
- 详解varint编码原理
什么是Varint编码 Varint是一种使用一个或多个字节序列化整数的方法,会把整数编码为变长字节.对于32位整型数据经过Varint编码后需要1~5个字节,小的数字使用1个byte,大的数字使用5 ...
- 一文详解IMU模型原理和标定选型
本文仅做学术分享,如有侵权,请联系删文. 干货下载与学习 后台回复:巴塞罗那自治大学课件,即可下载国外大学沉淀数年3D Vison精品课件 后台回复:计算机视觉书籍,即可下载3D视觉领域经典书籍pdf ...
- 装饰器是什么?一文详解装饰器原理及 Python 计时器实战
在本文中,我将和大家一起了解装饰器的工作原理,如何将我们之前定义的定时器类 Timer 扩展为装饰器,以及如何简化计时功能.最后对 Python 定时器系列文章做个小结.喜欢记得收藏.关注.点赞. 文 ...
- 深入浅出,一文详解*毫米波*雷达原理及应用技术
专栏解读: 本专栏针对自动驾驶技术(智能网联汽车技术)中的感知技术进行详细介绍. 包含: 汽车感知技术概念 多传感器融合原理 各传感器原理及应用(超声波,毫米波,激光雷达,视觉传感器,全球定位系统) ...
- 一文详解PnP算法原理
PnP(Perspective-n-Point)问题的几何结构如图1所示,给定3D点的坐标.对应2D点坐标以及内参矩阵,求解相机的位姿. 数学语言描述如下: 图1.PnP几何结构 1.直接线性变换法( ...
- yolov系列-yolov1-论文详解
yolov系列-yolov1-论文详解 @[TOC](yolov系列-yolov1-论文详解) yolov1相关资料 yolov1论文详解 算法原理 yolov1优缺点 yolov1相关资料 yolo ...
- 一文详解编程中的随机数
一文详解编程中的随机数 随机数的类型 真随机数生成器 TRNG - True Random Number Generator 伪随机数生成器 PRNG - Pseudo Random Number G ...
- Pandas获取SQL数据库read_sql()函数及参数一文详解+实例代码
前言 Pandas常用作数据分析工具库以及利用其自带的DataFrame数据类型做一些灵活的数据转换.计算.运算等复杂操作,但都是建立在我们获取数据源的数据之后.因此作为读取数据源信息的接口函数必然拥 ...
最新文章
- 【青少年编程】黄羽恒:平行空间
- python有道翻译接口翻译页面-tornado框架学习及借用有道翻译api做自动翻译页面...
- PyQt之Eric:成功解决No module named 'my_image_rc'
- HDU2097 Sky数【进制】
- kvm实战--convirt使用
- 全自动mysql数据监控平台_Prometheus+Grafana打造Mysql监控平台
- php封隔器座封原理,各种封隔器的特点与坐封原理.ppt
- CSS列表样式(源码示例)
- getParameterValues 和 getParameter区别
- mysql安装创建数据库_mysql 安装创建数据库
- word批量调整图片大小--宏
- 解决桌面IE图标删除不掉问题
- dB dBm概念及计算
- 谷歌,Google,Chrome,检查工具栏常用功能介绍
- 超级干货:手把手教你如何实现数据可视化
- JavaWeb开发QQ动态表情-源文件
- devops实践: teamcity实现持续集成
- Ansible事实变量常见fact
- android 禁止第三方相机,谷歌突然宣布,Android 11推出新规,第三方相机软件猝不及防...
- 蓝桥杯练习题之数列特征
热门文章
- php开发App接口
- hadoop处理excel数据
- 三级等级保护之安全管理中心
- 前言:智能车制作的那些事
- 饥荒服务器显示APPID,Steam饥荒
- 如何解决unity使用vs2017、vs2018、vs2019等 编辑器创建新项目时无法产生.sln文件的一个小办法
- android.dig机器人采访,机器人学导论心得 - osc_jjc36t9p的个人空间 - OSCHINA - 中文开源技术交流社区...
- 驾驶员监控系统(DMS)
- 全能电子地图下载器——MapTileDownloader
- 可以出题的答题小程序