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编解码和数据库存储时所要作的转换,避免了编码信息长度在此过程中的增加,并统一了数据库、表单等处对象标识符的格式。
目录
相关文章
|
3月前
|
缓存 分布式计算 数据处理
|
3月前
|
存储
字符编码问题之mbtowc 函数中计算最终的 Unicode 值如何解决
字符编码问题之mbtowc 函数中计算最终的 Unicode 值如何解决
16 0
|
5月前
|
机器学习/深度学习 C语言
目标类型的编码规则解码原类型的编码规则
类型转换:目标类型的编码规则解码原类型的编码规则
|
4月前
|
存储 NoSQL Redis
Redis07命令-String类型字符串,不管是哪种格式,底层都是字节数组形式存储的,最大空间不超过512m,SET添加,MSET批量添加,INCRBY age 2可以,MSET,INCRSETEX
Redis07命令-String类型字符串,不管是哪种格式,底层都是字节数组形式存储的,最大空间不超过512m,SET添加,MSET批量添加,INCRBY age 2可以,MSET,INCRSETEX
|
存储 Java
[初始java]——规范你的命名规则,变量的使用和注意事项,隐式转化和强制转化
[初始java]——规范你的命名规则,变量的使用和注意事项,隐式转化和强制转化
|
存储 编解码 自然语言处理
【C++要笑着学】编码的由来 | basic_string模板类 | string类的常用接口讲解 | 学会查文档(一)
好久不见!前段时间比较忙,更新频率有所减缓。好在现在快忙完了,我又有时间更文咯,还希望大伙能多多支持!我将会呈现出更多高质量的博客给大家!
106 0
【C++要笑着学】编码的由来 | basic_string模板类 | string类的常用接口讲解 | 学会查文档(一)
|
存储 安全 前端开发
Go-字符和字符串类型详解(原始字符串、拼接、修改、比较、拆分、查找等)
Go-字符和字符串类型详解(原始字符串、拼接、修改、比较、拆分、查找等)
153 0
Go-字符和字符串类型详解(原始字符串、拼接、修改、比较、拆分、查找等)
|
Oracle 关系型数据库
oracle按code编码长度查询代码展现层级关系(给字段前加空格)
学习oracle按code编码长度查询代码展现层级关系(给字段前加空格)
151 0
oracle按code编码长度查询代码展现层级关系(给字段前加空格)
ML之DS:仅需一行代码实现对某字段下的所有数值实现同一机制的改变或转换(比如全部转为str类型/全部取平方值)
ML之DS:仅需一行代码实现对某字段下的所有数值实现同一机制的改变或转换(比如全部转为str类型/全部取平方值)
ML之DS:仅需一行代码实现对某字段下的所有数值实现同一机制的改变或转换(比如全部转为str类型/全部取平方值)
|
XML 存储 算法
为啥要 base64 编码?
为啥要 base64 编码?
277 0
为啥要 base64 编码?