base64在安全领域主要用于安全文件或数据的传输及存储,如一些专业的证书、密钥、token等,它们并不遵守任何文字编码,如果你用文字工具打开看,会看到很多特殊字符(乱码)。这些乱码在网上传输的时候,可能会被多个网关接收并转发,而有的网关并不一定能识别这些乱码,从而导致你的数据被错误处理或丢失。此时就需要先将乱码转换为大家都能识别的字符,才能正常传输,这种公认的字符就是base64编码。
64个字符
base64编码就是将你的原始数据转换成只包含64种字符的编码格式,这64种字符是大家都支持的,如下:
52个大小写字母,10个数字,2个符号。索引是它的十进制数值,64个数值刚好可以用6位二进制表示。
转换过程
- 将原始数据按其原有的编码格式,转换为二进制。
- 在计算机中1个字节是8位二进制,每次将3个8位二进制拆分为4个6位二进制。3*8=24=4*6。
- 在6位二进制前面补2个0,变成8位二进制,占满一个字节。
- 将第3步的8位二进制转换为十进制数字,其中只有尾数6位是有效的,所以数值刚好就是上图中的0-63。
- 根据图的数值对应的字符,就是最终的转换结果。
比如:小字字母x,编写以下java代码可看到它的ASCII码值为120
int x='x';
System.out.println(x);
- 120=64+32+16+8,用8位二进制表示为01111000。
- 此时最多只够转换为2个6位二进制:011110 000000 这里尾数不够补了4个0。
- 前面补0转8位二进制:00011110 00000000
- 转十进制:30 0
- 对应上图中字符:e A
我们用java中的Base64类来验证一下
String x = Base64.getMimeEncoder().encodeToString("x".getBytes());
System.out.println(x);
最终输出 eA==,上面说过每4个6位二进制为一组,如果最后不足4个的,后面补=号。也有些编码工具不补等号,因为在解码的时候根据4的倍数就能知道它的总长度。
版权声明:本文为wangb_java原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。