Java-Base64算法
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java-Base64算法相关的知识,希望对你有一定的参考价值。
Base64算法最早是为了解决电子邮件传输的问题的,早先的邮件传输协议中只支持ASCII码传递,如果要传输二进制文件,如图片和视频,是无法传输的,而BASE64可以将二进制文件内容编码成为只包含ASCII码的内容,这样就可以传输了。
Base64算法大家常常说成是加密算法,但准确的来说,Base64不是一种加密算法,只能算是一种基于64个字符的编码算法。
它有一个字符映射表,每个字符映射了一个十进制编码,共映射了64个字符。Base64将给定的数据经二进制转换后与字符映射表相对应,得到所谓的密文;映射表如下,映射表的最后是一个等号,是作为补位符用来补位的。
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Base64算法的实现步骤如下:
1. 将给定的字符串以字符为单位转换为对应的字符编码(如ASCII码); 2. 将获得的字符编码转换为二进制码; 3. 对获得的二进制码做分组转换操作,每3个8位二进制码为一组,转换为每4个6位二进制码为一组(不足6位时地位补0).这是一个分组变化的过程,3个8位二进制码和4个6位二进制码的长度都是24位; 4. 对获得的4个6位二进制补位,向6位二进制码添加2位高位0,组成4个8位二进制码; 5. 将获得的4个8位二进制码转换位10进制码; 6. 将获得的十进制码转换位Base64字符表中对应的字符;
ASCII码字符编码
例如:对A进行Base64编码;
最终:QQ== |
|
最终生成的编码中有了两个等号,这是因为原文的二进制码不足24位,最近转换为十进制码时也不足4项,这时就需要用等号补位;
经Base64编码后的字符串最多只会有2个等号,这是因为 余数 = 原文字节数 MOD 3,所以余数只能时0,1,2。通常判别一个字符串是不是Base64编码的第一步操作就是判断这个字符串末尾是不是有等号。这同时也说明,Base64编码后的字符串是以4个字符为单位,其长度只能是4个字符的整数倍。
非ASCII码字符编码
ASCII码可以表示十进制范围为0~127的字符,对应二进制范围是00000000~01111111,ASCII码包含了阿拉伯数字,大小写英文字母和一些控制符,但却没有包含中文,因此有了GB2312,GBK和UTF-8等编码。GBK,GB2312用2个字节来表示一个汉字,UTF-8则用3个字节来表示一个汉字。
例如:对密这个字以UTF-8的形式进行Base64编码;
最终:5a+G |
|
当然,如果我们不使用UTF-8,而是使用GBK来进行编码,那编码后的结果就不是5a+G了。
JDK中Base64的实现在JDK1.7之前是没有对外的公共接口的,只有一个非标准实现,位于sun.misc包中,提供BASE64Encoder类和BASE64Decoder类。由于是不对外,所以不建议使用,因为后续JDK版本可能会去掉对这两个类的支持。
而JDK8之后已经有了对应的接口,位于java.util包下。
参考自《Java加密解密的艺术》
以上是关于Java-Base64算法的主要内容,如果未能解决你的问题,请参考以下文章
c_cpp 快速代码片段,用于在统计(阻止)/ dev / rdsk中的设备时验证fstat64和stat64的行为。