百度百科的介绍
Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,大家可以查看RFC2045~RFC2049,上面有MIME的详细规范。Base64编码可用于在HTTP环境下传递较长的标识信息。例如,在Java Persistence系统Hibernate中,就采用了Base64来将一个较长的唯一标识符(一般为128-bit的UUID)编码为一个字符串,用作HTTP表单和HTTP GET URL中的参数。在其他应用程序中,也常常需要把二进制数据编码为适合放在URL(包括隐藏表单域)中的形式。此时,采用Base64编码具有不可读性,即所编码的数据不会被人用肉眼所直接看到。
通俗点讲就是,Base64是一种很常用的,用来传输的编码方式。同时可以用来简单加密来隔离某些数据,因为他是肉眼不可读的。
原理
Base64要求把每三个8Bit的字节转换为四个6Bit的字节(3*8 = 4*6 = 24),然后把6Bit再添两位高位0,组成四个8Bit的字节,也就是说,转换后的字符串理论上将要比原来的长1/3。
例子:
转换前 11111111, 11111111, 11111111 (二进制)
转换后 00111111, 00111111, 00111111, 00111111 (二进制)
上面的三个字节是原文,下面的四个字节是转换后的Base64编码,其前两位均为0。
再把转换后的二进制转换成十进制来对应一张码表。码表公有2的8次=64个不同的字符组成,所以就要Base64编码。
代码:
网上有很多种Base64编码解码的类库,比如ap ,sun公司的,在这里我们用这两个做例子进行进行一下两者的区别。
String sunBase64="asdasadaasdasdas";
String res=new BASE64Encoder().encode(sunBase64.getBytes());
System.out.println("sun的结果"+res);
res=new String(Base64.encodeBase64(sunBase64.getBytes()));
System.out.println("apache的结果"+res);
System.out.println("-------------区别----------");
sunBase64="asdassdfsfasssssssssssssdasdasdasdaafgfgfdsdfgsfgsfgsfdgwwwwwwwwwwwwwwwwwweeeeeeeeeeeeeeeerrrrrrrrrrrrrradaasdasdas";
System.out.println("----sun的编码");
res=new BASE64Encoder().encode(sunBase64.getBytes());
System.out.println("sun的结果"+res);
res=new String(new BASE64Decoder().decodeBuffer(res));
System.out.println(res);
System.out.println();
System.out.println("----apache的编码");
res=new String(Base64.encodeBase64(sunBase64.getBytes()));
System.out.println("apache的结果"+res);
res=new String(Base64.decodeBase64(res.getBytes()));
System.out.println(res);
sun的结果YXNkYXNhZGFhc2Rhc2Rhcw==
apache的结果YXNkYXNhZGFhc2Rhc2Rhcw==
-------------区别----------
----sun的编码
sun的结果YXNkYXNzZGZzZmFzc3Nzc3Nzc3Nzc3NzZGFzZGFzZGFzZGFhZmdmZ2Zkc2RmZ3NmZ3NmZ3NmZGd3
d3d3d3d3d3d3d3d3d3d3d3dlZWVlZWVlZWVlZWVlZWVlcnJycnJycnJycnJycnJhZGFhc2Rhc2Rh
cw==
asdassdfsfasssssssssssssdasdasdasdaafgfgfdsdfgsfgsfgsfdgwwwwwwwwwwwwwwwwwweeeeeeeeeeeeeeeerrrrrrrrrrrrrradaasdasdas
----apache的编码
apache的结果YXNkYXNzZGZzZmFzc3Nzc3Nzc3Nzc3NzZGFzZGFzZGFzZGFhZmdmZ2Zkc2RmZ3NmZ3NmZ3NmZGd3d3d3d3d3d3d3d3d3d3d3d3dlZWVlZWVlZWVlZWVlZWVlcnJycnJycnJycnJycnJhZGFhc2Rhc2Rhcw==
asdassdfsfasssssssssssssdasdasdasdaafgfgfdsdfgsfgsfgsfdgwwwwwwwwwwwwwwwwwweeeeeeeeeeeeeeeerrrrrrrrrrrrrradaasdasdas
仔细观察,就会发现两者在转换成BASE64时有微小的区别,sun公司的会自动换行,而apache则是一行到底。
当编码的字节较长时,encode出来的字符串会自动加入\n\r进行自动换行。针对这个问题,原因是rfc规范规定76个字符换一次行。在有些情况这会影响我们的校验,其次sun公司的编码效率较低。所以尽量不要使用sun的Babe64.