base64编码底层转换规则举例解读

简介: base64编码底层转换规则举例解读

一.作用

Base64就是一种基于64个可打印字符来表示二进制数据的方法,把一些不可打印的字符转换成全部都是可打印的字符。

ps:关于ASCII编码(含扩展ASCII)中,打印字符和不可打印字符:https://blog.csdn.net/MrYushiwen/article/details/107998062

二.base64编码转换表(64个可打印字符)

总共64个可打印字符,从0开始到63结束。
在这里插入图片描述

三.base64举例说明全过程

1.规则

关于这个编码的规则:

  1. 把3个字节变成4个字节,6位为一组,高位补两个0,组成一个字节,这样十进制中正好从0到63
  2. 每76个字符加一个换行符。
  3. 最后的结束符也要处理。
    Base64要求把每三个8Bit的字节转换为四个6Bit的字节(3*8 = 4*6 = 24),然后把6Bit再添两位高位0,组成四个8Bit的字节,也就是说,转换后的字符串理论上将要比原来的长1/3。

2.举例一(末尾没有=号)

把UTF-8编码的abc进行base64编码其具体过程如下:

  1. UTF-8编码的abc其底层用二进制表示为01100001 01100010 01100011
  2. 拆分,每六位一组:011000 010110 001001 100011
  3. 高位补两个0:00011000,00010110,00001001 , 00100011
  4. 查找base64编码转换表,00011000,00010110,00001001 , 00100011十进制为:24,22,9,33,对于的字符为:YWJj

2.举例二(末尾有=号)

在1中的规则,第一条对于这个有稍微的变化,因为这个末尾差分6个为一组时,最后只有4个,怎么办呢,先低位补0,补成6位,然后在高位补两个0,组成一个字节,这样十进制中正好从0到63

把UTF-8编码的ab进行base64编码其具体过程如下:

  1. UTF-8编码的ab其底层用二进制表示为01100001 01100010
  2. 拆分,每六位一组,末尾只有4位,先低位补0,补成6位:011000 010110 001000
  3. 高位补两个0:00011000,00010110,00001000
  4. 查找base64编码转换表,00011000,00010110,00001000 十进制为:24,22,8对于的字符为:YWI
  5. 在举例1中字节数量应该是3的倍数,如果这个条件不能满足的话,具体的解决办法是这样的:剩余的字节根据编码规则继续单独转过程如上述所述,最后再用=号补满4个字节。这就是为什么有些Base64编码会以一个或两个等号结束的原因,但等号最多只有两个。因为一个原字节至少会变成两个目标字节,所以余数任何情况下都只可能是0,1,2这三个数中的一个。如果余数是0的话,就表示原文字节数正好是3的倍数(最理想的情况)。如果是1的话,转成2个Base64编码字符,为了让Base64编码是4的倍数,就要补2个等号;同理,如果是2的话,就要补1个等号。
  6. 补一个=号,最后结果为:YWI=

四.关于URL的改进Base64编码

  • 标准的Base64并不适合直接放在URL里传输,因为URL编码器会把标准Base64中的“/”和“+”字符变为形如“%XX”的形式,而这些“%”号在存入数据库时还需要再进行转换,因为ANSI SQL中已将“%”号用作通配符。
  • 为解决此问题,可采用一种用于URL的改进Base64编码,它在末尾填充’='号,并将标准Base64中的“+”和“/”分别改成了“-”和“_”,即把 二.base64编码转换表(64个可打印字符)中的62和63对应的字符改成了-_
  • 这样就免去了在URL编解码和数据库存储时所要作的转换,避免了编码信息长度在此过程中的增加,并统一了数据库、表单等处对象标识符的格式。
目录
相关文章
|
1月前
|
自动驾驶 物联网 5G
|
5月前
|
机器学习/深度学习 C语言
目标类型的编码规则解码原类型的编码规则
类型转换:目标类型的编码规则解码原类型的编码规则
|
6月前
|
编译器 C++
47不同类型数据间的转换
47不同类型数据间的转换
33 0
|
存储 Java
[初始java]——规范你的命名规则,变量的使用和注意事项,隐式转化和强制转化
[初始java]——规范你的命名规则,变量的使用和注意事项,隐式转化和强制转化
|
前端开发 IDE Java
VS不支持C99标准变长数组的概念
VS不支持C99标准变长数组的概念
|
前端开发 程序员 C#
【C#】通过扩展对象的方式,对字符串等数据类型进行数据进一步处理
在本篇文章中,我们讲一起了解下对象扩展的使用 在实际项目开发中,对象扩展使用的场景还是挺多的,比如:需要对时间值进行再处理,或者字符串中的斜杠(/)转为反斜杠(\)
115 0
|
存储 安全 前端开发
Go-字符和字符串类型详解(原始字符串、拼接、修改、比较、拆分、查找等)
Go-字符和字符串类型详解(原始字符串、拼接、修改、比较、拆分、查找等)
156 0
Go-字符和字符串类型详解(原始字符串、拼接、修改、比较、拆分、查找等)
|
JavaScript 前端开发 算法
从规范的角度解析对象 — 原始值转换
从规范的角度解析对象 — 原始值转换
145 0
从规范的角度解析对象 — 原始值转换
|
C语言 C++ 异构计算
HLS开发学习-04- 数据类型的处理--任意精度数据类型
HLS开发学习-04- 数据类型的处理--任意精度数据类型
187 0
HLS开发学习-04- 数据类型的处理--任意精度数据类型