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

举报
YuShiwen 发表于 2022/03/31 00:11:35 2022/03/31
【摘要】 一.作用 Base64就是一种基于64个可打印字符来表示二进制数据的方法,把一些不可打印的字符转换成全部都是可打印的字符。 ps:关于ASCII编码(含扩展ASCII)中,打印字符和不可打印字符:ht...

一.作用

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编解码和数据库存储时所要作的转换,避免了编码信息长度在此过程中的增加,并统一了数据库、表单等处对象标识符的格式。

文章来源: blog.csdn.net,作者:Mr.Yushiwen,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/MrYushiwen/article/details/120266000

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。