持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第4天,点击查看活动详情
Base64并不是一种加密算法,是一种编码方式,用于在Http网络上传输数据使用。我们常用的Base64编码不是标准的,是用于URL改进的Base64编码,因为使用标准的Base64编码方式传输的话,某些字符会被URL编码器转变形式,如将的“/”和“+”字符变成“%XX”这种形式。
那么改进的Base64编码怎么解决呢,有些(Base64不止一种)Base64编码将标准Base64中的“+”和“/”分别改成了“-”和“_”,这样就免去了在URL编解码和数据库存储时所要作的转换,避免了编码信息长度在此过程中的增加,并统一了数据库、表单等处对象标识符的格式。
另有一种用于正则表达式的改进Base64变种,它将“+”和“/”改成了“!”和“-”,因为“+”,“*”以及前面在IRCu中用到的“和”在正则表达式中都可能具有特殊含义。
……
当然了,这里不赘述相关,我们主要了解的是如何将平常我们看到的数据编码成Base64形式
Base64要求把每三个8Bit的字节转换为四个6Bit的字节(38 = 46 = 24),然后把6Bit再添两位高位0,组成四个8Bit的字节,也就是说,转换后的字符串理论上将要比原来的长1/3。
下面来演示+讲解
(1)原数据:就是平常我们看到的字符,这里用Hao三个字符来
(2)我们需要得到这三个数据的二进制方式,但是字符转二进制方式不方便,我们去ASCII码表找,只要找到字符的其中一个进制,转换成二进制就很方便了(能直接找到就更好了)
转换二进制后:
(3)将8位为单位的二进制分割成6位为单位的二进制,上面8 * 3个位恰好可以分成 6 * 4个位;这里要注意,计算机是一个字节占8位,不够就自动高位补0,这里是为了方便直接用6位。
(4)将6位为单位的二进制数据转换成十进制
(5)此时可以对应Base64编码表找到对应的字符
Base64对照表:
转换后:
(6)验证,可以通过在线Base64编码解码
(7)上面的例子刚好是8 * 3 = 6 * 4,那么我们试一下原来的数据组成二进制后不是6的倍数;
可以看到红色部分是自动补的0,后面两个==号是怎么回事呢,Base64要求把每三个8Bit的字节转换为四个6Bit的字节,那么这里只有4个8Bit的字节,转换成6Bit之后也只有6个字节,还缺两个,怎么办?直接用=号替换,注意不是用00000000替换,00000000在ASCII码表为空字符
而=号在Base64转换表是没有对应的十进制索引的,所以用来补缺少的字节位,目的是为了让Base64编码长度为4的倍数。
呼应开头就是Base64只是一种编码方式,并非加密算法,只要拿着转换表,Base64也可以被轻易解码。