1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > base64 decode java_Java实现Base64编解码

base64 decode java_Java实现Base64编解码

时间:2020-11-27 12:08:55

相关推荐

base64 decode java_Java实现Base64编解码

为什么要用Base64编码

在网络中传输数据都是使用ascii方式传输。对于一些图片、视频等数据,可能就会被编码成ascii中不可见部分的编码。网络中不同的路由设备处理方式不同,有可能就会把这部分数据弄丢了。为了保证数据传输的正确性,可以使用Base64编码将这些不可见数据编码成可见数据。

Java实现Base64编解码的几种方法

方法一

使用sun.misc包中的BASE64Encoder和BASE64Decoder类进行编解码。这种方式比较古老,不推荐使用。

代码如下:

/*** sun.misc方式Base64编码

*@paramstr

*@return

*/

public staticString encodeBySunMisc(String str) {try{return new BASE64Encoder().encode(str.getBytes("UTF-8"));

}catch(UnsupportedEncodingException e) {

e.printStackTrace();return "";

}

}/*** sun.misc方式Base64解码

*@paramstr

*@return

*/

public staticString decodeBySunMisc(String str) {try{byte[] result = newBASE64Decoder().decodeBuffer(str);return newString(result);

}catch(IOException e) {

e.printStackTrace();return "";

}

}

sun.misc的Base64工具虽然在jdk中,但是并不属于标准库,所以在Eclipse中无法直接使用。可以通过手动引入方式使用。

解决方法:

右键工程->Properties->Java Build Path->Libraries,点击Add External Jars,选择%JAVA_HOME%\jre\lib\rt.jar即可。

方法二

使用Apache的commons-code包。这种方式比sun.misc方式要稍快一些。

代码如下

/*** commons-code方式Base64编码

*@paramstr

*@return

*/

public staticString encodeByCommonsCode(String str) {byte[] result;try{

result= mons.codec.binary.Base64.encodeBase64(str.getBytes("UTF-8"));return newString(result);

}catch(UnsupportedEncodingException e) {

e.printStackTrace();return "";

}

}/*** commons-code方式Base64解码

*@paramstr

*@return

*/

public staticString decodeByCommonsCode(String str) {byte[] result =mons.codec.binary.Base64.decodeBase64(str.getBytes());return newString(result);

}

使用commons-code需要引入依赖。以gradle工程为例,需要在build.gradle中添加以下行:

implementation 'commons-codec:commons-codec:1.11'

方法三

使用Apache的xerces工具。这个工具主要用于解析xml的,具有Base64编解码功能。

代码如下:

/*** xerces方式Base64解码

*@paramstr

*@return

*/

public staticString decodeByXerces(String str) {try{byte[] result =.apache.xerces.internal.impl.dv.util.Base64.decode(str);return newString(result);

}catch(Exception e) {

e.printStackTrace();return "";

}

}/*** Java8中的Base64编码

*@paramstr

*@return

*/

public staticString encodeByJava8(String str) {try{return Base64.getEncoder().encodeToString(str.getBytes("UTF-8"));

}catch(Exception e) {

e.printStackTrace();return "";

}

}

方法四

Java8的util套件中已经自带Base64编解码工具,并且效率非常高,推荐使用这种方式。

代码如下:

/*** Java8中的Base64编码

*@paramstr

*@return

*/

public staticString encodeByJava8(String str) {try{return Base64.getEncoder().encodeToString(str.getBytes("UTF-8"));

}catch(Exception e) {

e.printStackTrace();return "";

}

}/*** Java8中的Base64解码

*@paramstr

*@return

*/

public staticString decodeByJava8(String str) {byte[] result =Base64.getDecoder().decode(str.getBytes());return newString(result);

}

测试几种编码效果:

测试代码如下:

private static voidtestEncodeAndDecode(String src) {

String encedeStr1=encodeBySunMisc(src);

System.out.println("encode by sun misc: " +encedeStr1);

String decedeStr1=decodeBySunMisc(encedeStr1);

System.out.println("decode by sun misc: " +decedeStr1);

String encedeStr2=encodeByCommonsCode(src);

System.out.println("encode by commons-code: " +encedeStr2);

String decedeStr2=decodeByCommonsCode(encedeStr2);

System.out.println("decode by commons-code: " +decedeStr2);

String encedeStr3=encodeByXerces(src);

System.out.println("encode by xerces: " +encedeStr3);

String decodeStr3=decodeByXerces(encedeStr3);

System.out.println("decode by xerces: " +decodeStr3);

String encedeStr4=encodeByJava8(src);

System.out.println("encode by java8: " +encedeStr4);

String decedeStr4=decodeByJava8(encedeStr4);

System.out.println("decode by java8: " +decedeStr4);

}

测试结果如下:

encode by sun misc: YWJjZGVmZ2hpamtsbW5vcHFyc3Q7

decode by sun misc: abcdefghijklmnopqrst;

encode by commons-code: YWJjZGVmZ2hpamtsbW5vcHFyc3Q7

decode by commons-code: abcdefghijklmnopqrst;

encode by xerces: YWJjZGVmZ2hpamtsbW5vcHFyc3Q7

decode by xerces: abcdefghijklmnopqrst;

encode by java8: YWJjZGVmZ2hpamtsbW5vcHFyc3Q7

decode by java8: abcdefghijklmnopqrst;

比较一下几种编解码的效率。对每种编码方式使用20+个字符先进行编码,再进行解码,共执行100万次,比较一下总的执行时间。

测试代码如下:

//测试sun.misc编解码效率

private static voidtestSunMisc(String src) {long begin =System.currentTimeMillis();for(int i = 0; i < 1000000; i++) {

String encedeStr1= encodeBySunMisc(src +i);

decodeBySunMisc(encedeStr1);

}long finish =System.currentTimeMillis();

System.out.println("sun misc consume: " + (finish - begin) + "ms");

}//测试commons-code编解码效率

private static voidtestCommonsCode(String src) {long begin =System.currentTimeMillis();for(int i = 0; i < 1000000; i++) {

String encedeStr1= encodeByCommonsCode(src +i);

decodeByCommonsCode(encedeStr1);

}long finish =System.currentTimeMillis();

System.out.println("commons-code consume: " + (finish - begin) + "ms");

}//测试xerces编解码效率

private static voidtestXerces(String src) {long begin =System.currentTimeMillis();for(int i = 0; i < 1000000; i++) {

String encedeStr1= encodeByXerces(src +i);

decodeByXerces(encedeStr1);

}long finish =System.currentTimeMillis();

System.out.println("xerces consume: " + (finish - begin) + "ms");

}//测试Java8编解码效率

private static voidtestJava8(String src) {long begin =System.currentTimeMillis();for(int i = 0; i < 1000000; i++) {

String encedeStr1= encodeByJava8(src +i);

decodeByJava8(encedeStr1);

}long finish =System.currentTimeMillis();

System.out.println("java 8 consume: " + (finish - begin) + "ms");

}public static voidmain(String[] args) {

String src= "abcdefghijklmnopqrst;";

testSunMisc(src);

testCommonsCode(src);

testXerces(src);

testJava8(src);

}

总共测试3次,输出结果如下:

commons-code consume: 3337ms

sun misc consume: 6532ms

xerces consume: 554ms

java 8 consume: 547ms

commons-code consume: 3148ms

sun misc consume: 6445ms

xerces consume: 498ms

java 8 consume: 466ms

commons-code consume: 3442ms

sun misc consume: 6674ms

xerces consume: 470ms

java 8 consume: 512ms

结论

古老的sun.misc方式效率最低,而xerces和Java8方式效率最高。由于Java8的便利性,推荐直接使用Java8中自带的Base64工具进行编解码。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。