java的Base64算法详解以及Base64

百度百科的介绍

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.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值