base64编码的原理

前言

最近做项目,经常使用base64把byte[]转为String存储,毕竟byte数组不好存储,就对base64的原理好奇,研究了下,发现base64后长度增加了,这个64代表的含义呢,2的6次方,在2进制有特别的含义,毕竟1byte=8bit,这中间有些特殊的设定意义。

demo

 这里的abcde是怎么转为YWJjZGU=的呢,可以明显看出转为base64后长度增加了,实际上我们是把String的byte[]转为base64的,末尾的=号是怎么来的。

 可以看到JDK9开始的String转为byte[]存储,节约空间,而byte[]{97, 98, 99, 100, 101} 5个字节是怎么转为YWJjZGU=8个字节的。

原理

Base64 编码原理:

  1. 把每三个 8bit 字节转换为四个 6Bit 字节 (3*8 = 4*6 = 24), 然后再向每 6Bit 字节 (2的6次方 = 64) 添两高位 0, 组成四个 8Bit 字节。
  2. 以每次转换的 4 个数字作为一个分段,然后查表获得相应的 4 个字符,就是编码后的字符串。
  3. 若要编码的二进制数据不是 3 的倍数, 最后剩下 1 或 2 个字节, Base64 用 \x00 字节在末尾补足后,再在编码的末尾加上 1 或最多 2 个 = 号。

码表如上:由A-Z a-z 0-9 + / ,26+26+10+2=64个编码

比如示例的abcde,换算成byte[]为byte[]{97, 98, 99, 100, 101},换算成2进制bit存储如下

10进制979899100101
bit 2进制0110000101100010011000110110010001100101

安装base64编码原则,3个字节为1组,编码为4个字节组,空间扩容1/3

红色表示不足3byte,补0为3byte。对6bit的重新编码数据前面补0凑齐8bit,即一个byte,数据增加8/6,加上不足3byte编码的补0,额外增加了很多数据,但是就可以安装64的码表编码了。相当于把2的8次方数据,按照2的6次方编码,然后补0,按照2的8次方存储。

bit 2进制011000010110001001100011011001000110010100000000
编码011000   |   010110   |   001001   |   100011011001   |   000110   |   010100   |   000000
编码后10进制24                 22               9                3525                 6               20                =
查表Y                   W               J                 jZ                  G               U                 =

 

查表得YWJjZGU=(=表示末尾补0的位数,最多2个==),这里的base64不能用于正则表达式匹配,因为+ /为关键字。

 

 那个如果byte是负数呢,实际上byte为负数,也可以转为2进制,同理进行编码

比如-128,二进制就是10000000,因为计算机只有加法,负数在计算机中是用补码存储

-128就是128的原码1000 0000求反0111 1111 +1 -> 1000 0000

bit 2进制100000000110001001100011011001000110010100000000
编码100000   |   000110   |   001001   |   100011011001   |   000110   |   010100   |   000000
编码后10进制32                 6                9                3525                 6               20                =
查表g                   G               J                 jZ                  G               U                 =

运行程序,跟手动运算结果一样

总结

base64实际上就是对byte数组重新编码,以3个byte为单位,编码成4个byte数据,首位补0,凑齐8bit(1byte数据),对byte进行转为10进制,查表得到base64的字符串,当3个byte凑不齐时,补0 ,base64字符串结尾使用=表示补了几个0。根据base64的编码原则,实际上可以开发其他编码的,比如特殊+ / 可以使用其他符号表示,或者不使用64位。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值