最近在看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-Za-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编码原理相关推荐

  1. 详解Base64编码和解码

    Base64是最常用的编码之一,比如开发中用于传递参数.现代浏览器中的<img />标签直接通过Base64字符串来渲染图片以及用于邮件中等等.Base64编码在RFC2045中定义,它被 ...

  2. 一文轻松明白 Base64 编码原理

    把图片丢进浏览器,打开sources能看到一长串字符串,这是图片的Base64编码.这一长串编码到底是怎么生成的呢? 我们接下来探索一下base64编码的原理 Base64 名称的由来 Base64编 ...

  3. 详解varint编码原理

    什么是Varint编码 Varint是一种使用一个或多个字节序列化整数的方法,会把整数编码为变长字节.对于32位整型数据经过Varint编码后需要1~5个字节,小的数字使用1个byte,大的数字使用5 ...

  4. 一文详解IMU模型原理和标定选型

    本文仅做学术分享,如有侵权,请联系删文. 干货下载与学习 后台回复:巴塞罗那自治大学课件,即可下载国外大学沉淀数年3D Vison精品课件 后台回复:计算机视觉书籍,即可下载3D视觉领域经典书籍pdf ...

  5. 装饰器是什么?一文详解装饰器原理及 Python 计时器实战

    在本文中,我将和大家一起了解装饰器的工作原理,如何将我们之前定义的定时器类 Timer 扩展为装饰器,以及如何简化计时功能.最后对 Python 定时器系列文章做个小结.喜欢记得收藏.关注.点赞. 文 ...

  6. 深入浅出,一文详解*毫米波*雷达原理及应用技术

    专栏解读: 本专栏针对自动驾驶技术(智能网联汽车技术)中的感知技术进行详细介绍. 包含: 汽车感知技术概念 多传感器融合原理 各传感器原理及应用(超声波,毫米波,激光雷达,视觉传感器,全球定位系统) ...

  7. 一文详解PnP算法原理

    PnP(Perspective-n-Point)问题的几何结构如图1所示,给定3D点的坐标.对应2D点坐标以及内参矩阵,求解相机的位姿. 数学语言描述如下: 图1.PnP几何结构 1.直接线性变换法( ...

  8. yolov系列-yolov1-论文详解

    yolov系列-yolov1-论文详解 @[TOC](yolov系列-yolov1-论文详解) yolov1相关资料 yolov1论文详解 算法原理 yolov1优缺点 yolov1相关资料 yolo ...

  9. 一文详解编程中的随机数

    一文详解编程中的随机数 随机数的类型 真随机数生成器 TRNG - True Random Number Generator 伪随机数生成器 PRNG - Pseudo Random Number G ...

  10. Pandas获取SQL数据库read_sql()函数及参数一文详解+实例代码

    前言 Pandas常用作数据分析工具库以及利用其自带的DataFrame数据类型做一些灵活的数据转换.计算.运算等复杂操作,但都是建立在我们获取数据源的数据之后.因此作为读取数据源信息的接口函数必然拥 ...

最新文章

  1. 【青少年编程】黄羽恒:平行空间
  2. python有道翻译接口翻译页面-tornado框架学习及借用有道翻译api做自动翻译页面...
  3. PyQt之Eric:成功解决No module named 'my_image_rc'
  4. HDU2097 Sky数【进制】
  5. kvm实战--convirt使用
  6. 全自动mysql数据监控平台_Prometheus+Grafana打造Mysql监控平台
  7. php封隔器座封原理,各种封隔器的特点与坐封原理.ppt
  8. CSS列表样式(源码示例)
  9. getParameterValues 和 getParameter区别
  10. mysql安装创建数据库_mysql 安装创建数据库
  11. word批量调整图片大小--宏
  12. 解决桌面IE图标删除不掉问题
  13. dB dBm概念及计算
  14. 谷歌,Google,Chrome,检查工具栏常用功能介绍
  15. 超级干货:手把手教你如何实现数据可视化
  16. JavaWeb开发QQ动态表情-源文件
  17. devops实践: teamcity实现持续集成
  18. Ansible事实变量常见fact
  19. android 禁止第三方相机,谷歌突然宣布,Android 11推出新规,第三方相机软件猝不及防...
  20. 蓝桥杯练习题之数列特征

热门文章

  1. php开发App接口
  2. hadoop处理excel数据
  3. 三级等级保护之安全管理中心
  4. 前言:智能车制作的那些事
  5. 饥荒服务器显示APPID,Steam饥荒
  6. 如何解决unity使用vs2017、vs2018、vs2019等 编辑器创建新项目时无法产生.sln文件的一个小办法
  7. android.dig机器人采访,机器人学导论心得 - osc_jjc36t9p的个人空间 - OSCHINA - 中文开源技术交流社区...
  8. 驾驶员监控系统(DMS)
  9. 全能电子地图下载器——MapTileDownloader
  10. 可以出题的答题小程序