问题背景:
最近在开发中用到了sun.misc.BASE64Encoder。发现两个问题:
其一、当编码的字节较长时,encode出来的字符串会自动加入\n\r进行自动换行。针对这个问题,原因是rfc规范规定76个字符换一次行。
其二、编码效率较低。
解决办法:
1、重写BASE64Encoder:
public class BASE64Encoder {
private static char[] codec_table = { 'A', 'B', 'C', 'D', 'E', 'F', 'G',
'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T',
'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g',
'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't',
'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6',
'7', '8', '9', '+', '/' };
public BASE64Encoder() {
}
public static String encode(byte[] a) {
int totalBits = a.length * 8;
int nn = totalBits % 6;
int curPos = 0;// process bits
StringBuffer toReturn = new StringBuffer();
while (curPos < totalBits) {
int bytePos = curPos / 8;
switch (curPos % 8) {
case 0:
toReturn.append(codec_table[(a[bytePos] & 0xfc) >> 2]);
break;
case 2:
toReturn.append(codec_table[(a[bytePos] & 0x3f)]);
break;
case 4:
if (bytePos == a.length - 1) {
toReturn
.append(codec_table[((a[bytePos] & 0x0f) << 2) & 0x3f]);
} else {
int pos = (((a[bytePos] & 0x0f) << 2) | ((a[bytePos + 1] & 0xc0) >> 6)) & 0x3f;
toReturn.append(codec_table[pos]);
}
break;
case 6:
if (bytePos == a.length - 1) {
toReturn
.append(codec_table[((a[bytePos] & 0x03) << 4) & 0x3f]);
} else {
int pos = (((a[bytePos] & 0x03) << 4) | ((a[bytePos + 1] & 0xf0) >> 4)) & 0x3f;
toReturn.append(codec_table[pos]);
}
break;
default:
//never hanppen
break;
}
curPos+=6;
}
if(nn==2)
{
toReturn.append("==");
}
else if(nn==4)
{
toReturn.append("=");
}
return toReturn.toString();
}
}
2、测试重写后的BASE64Encoder效率:
public static void main(String[] args) throws Exception {
BASE64Encoder encoder=new BASE64Encoder();
sun.misc.BASE64Encoder sunEncoder=new sun.misc.BASE64Encoder();
byte[] testBytes=new byte[1024*1024*2];
long start=System.currentTimeMillis();
for(int i=0;i<10;i++)
{
sunEncoder.encode(testBytes);
}
System.out.println("[sun encoder]use time :"+(System.currentTimeMillis()-start));
start=System.currentTimeMillis();
for(int i=0;i<10;i++)
{
encoder.encode(testBytes);
}
System.out.println("[our encoder]use time :"+(System.currentTimeMillis()-start));
}
测试后发现,重写后,编码自动回行问题解决,编码效率也会提高一倍。
分享到:
相关推荐
最近项目实验发现导入工具程序后项目有错,查看发现sun.misc.BASE64Decoder和sun.misc.BASE64Encoder不可用,找不到相应的类。 二、原因分析 冲浪后发现JDK中的lib\tools.jar和JRE中的lib\rt.jar已从Java SE 9中...
而`sun.misc.BASE64Encoder`和`BASE64Decoder`虽然存在潜在问题,但它们可以帮助开发者快速实现Base64编码和解码。为了遵循最佳实践,建议使用`java.util.Base64`包提供的API来替代这些非公开类。
`sun.misc.BASE64Encoder`和`sun.misc.BASE64Decoder`就是这样的两个类,它们分别用于Base64编码和解码。 Base64是一种用于将二进制数据转换为可打印ASCII字符的编码方式,常用于在网络上传输二进制数据,如电子...
在Java编程语言中,`sun.misc.BASE64Encoder` 和 `sun.misc.BASE64Decoder` 是两个用于Base64编码和解码的内部类,它们位于`sun.misc`包下。Base64是一种用于在网络上传输二进制数据的文本编码方式,它将任意的字节...
sun.misc.BASE64Decoder 其中包括 Android Base64Jar包 以及Java源代码 sun.misc.BASE64Decoder 其中包括 Android Base64Jar包 以及Java源代码 sun.misc.BASE64Decoder 其中包括 Android Base64Jar包 以及...
为了解决“找不到sun.misc.BASE64Encoder”的问题,你需要寻找一个替代方案。一种常见的解决方案是引入外部的加密库,例如Bouncy Castle。Bouncy Castle是一个强大的密码学库,提供了广泛的加密算法和功能,包括Base...
总的来说,尽管`sun.misc.BASE64Decoder`和`BASE64Encoder`在某些老项目中可能存在,但现代Java开发应尽量避免依赖这些类,转而使用标准的`java.util.Base64`模块,以确保代码的稳定性和可维护性。对于那些仍然需要...
sun.misc.BASE64Encoder找不到jar包的解决方法? 在MyEclipse中编写Java代码时,用到了BASE64Decoder,import sun.misc.BASE64Decoder;可是Eclipse提示: Access restriction: The type BASE64Decoder is not ...
BASE64Encode 编码,在andorid没有这个编码,这里面有打成jar包,可以导进去。用源代码打包的。手懒不愿意自己弄得话,可以下载导进去。里面附带着源代码,也可将源代码开进去直接使用,希望能帮助大家。
sun.misc.BASE64Encoder 找不到jar包
在Java中,`sun.misc.BASE64Encoder`和`sun.misc.BASE64Decoder`是用于处理BASE64编码和解码的类,它们位于`sun.misc`包下,这是一个非公开的、由Sun Microsystems提供的包,主要用于JVM内部使用。 然而,需要注意...
总的来说,虽然`sun.misc.BASE64Encoder`在某些情况下提供了便捷的BASE64编码功能,但由于其非公开性质和可能的兼容性问题,开发人员应谨慎使用,并考虑采用更稳定的解决方案。在Android开发中,使用`java.util.Base...
sun.misc.BASE64Decoder.jar sun.misc.BASE64Decoder.jar sun.misc.BASE64Decoder.jar sun.misc.BASE64Decoder.jar
rt.jar sun.misc.BASE64Encoder
java开发 sun.misc.BASE64Decoder.jar包下载 java开发 sun.misc.BASE64Decoder.jar包下载
Intellij-解决报错:import sun.misc.BASE64Decoder无法找到 报错原因:JDK从1.8升级到9.0.1后sun.misc.BASE64Decoder和sun.misc.BASE64Encoder不可用 sun.misc.BASE64Decoder
《深入解析Java 7中的sun.misc.BASE64Decoder》 在Java编程中,`sun.misc.BASE64Decoder`是Java 7版本中一个用于解码Base64编码的数据的类。Base64是一种广泛使用的编码方式,它将任意二进制数据转换为可打印的...
`sun.misc.BASE64Decoder` 类在Java早期版本中是提供非标准的BASE64解码功能,位于`sun.misc` 包下,这是一个非公开(internal)包,意味着它不是Java公共API的一部分,因此不保证在不同版本的JVM中稳定存在。...
《深入解析:Java中的sun.misc.BASE64Decoder及其在Java 8后的变化》 在Java编程语言中,`sun.misc.BASE64Decoder`是用于解码Base64编码字符串的一个类,它属于`sun.misc`包,这个包包含了Java标准库中的一些非公开...