`
mzh_2008beijing
  • 浏览: 234139 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

sun.misc.BASE64Encoder存在的问题及其解决方法

阅读更多
问题背景:   
     最近在开发中用到了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));

    }

     测试后发现,重写后,编码自动回行问题解决,编码效率也会提高一倍。
分享到:
评论
2 楼 v168052730 2016-04-26  
nice 非常感谢!
1 楼 xiaoxiaolang529 2013-07-12  
Good,谢谢你发现问题并解决了。

相关推荐

    sun.misc.BASE64Decoder和sun.misc.BASE64Encoder不可用已解决

    最近项目实验发现导入工具程序后项目有错,查看发现sun.misc.BASE64Decoder和sun.misc.BASE64Encoder不可用,找不到相应的类。 二、原因分析 冲浪后发现JDK中的lib\tools.jar和JRE中的lib\rt.jar已从Java SE 9中...

    sun.misc.BASE64Encoder源码及jar包

    而`sun.misc.BASE64Encoder`和`BASE64Decoder`虽然存在潜在问题,但它们可以帮助开发者快速实现Base64编码和解码。为了遵循最佳实践,建议使用`java.util.Base64`包提供的API来替代这些非公开类。

    sun.misc.BASE64Encoder.jar包

    `sun.misc.BASE64Encoder`和`sun.misc.BASE64Decoder`就是这样的两个类,它们分别用于Base64编码和解码。 Base64是一种用于将二进制数据转换为可打印ASCII字符的编码方式,常用于在网络上传输二进制数据,如电子...

    sun.misc.BASE64Encoder 加密源码+完整包.rar

    在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包 以及Java源代码 sun.misc.BASE64Decoder 其中包括 Android Base64Jar包 以及...

    sun.misc.BASE64Encoder 找不到

    为了解决“找不到sun.misc.BASE64Encoder”的问题,你需要寻找一个替代方案。一种常见的解决方案是引入外部的加密库,例如Bouncy Castle。Bouncy Castle是一个强大的密码学库,提供了广泛的加密算法和功能,包括Base...

    sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder;

    总的来说,尽管`sun.misc.BASE64Decoder`和`BASE64Encoder`在某些老项目中可能存在,但现代Java开发应尽量避免依赖这些类,转而使用标准的`java.util.Base64`模块,以确保代码的稳定性和可维护性。对于那些仍然需要...

    sun.misc.base64decoder.jar下载

    sun.misc.BASE64Encoder找不到jar包的解决方法? 在MyEclipse中编写Java代码时,用到了BASE64Decoder,import sun.misc.BASE64Decoder;可是Eclipse提示:  Access restriction: The type BASE64Decoder is not ...

    sun.misc.BASE64Encoder下载

    BASE64Encode 编码,在andorid没有这个编码,这里面有打成jar包,可以导进去。用源代码打包的。手懒不愿意自己弄得话,可以下载导进去。里面附带着源代码,也可将源代码开进去直接使用,希望能帮助大家。

    rt.jar sun.misc.BASE64Encoder sun.misc.BASE64Decoder 找不到jar包

    sun.misc.BASE64Encoder 找不到jar包

    apache-commons-codec-1.4.jar和sun.misc.BASE64Encoder.jar

    在Java中,`sun.misc.BASE64Encoder`和`sun.misc.BASE64Decoder`是用于处理BASE64编码和解码的类,它们位于`sun.misc`包下,这是一个非公开的、由Sun Microsystems提供的包,主要用于JVM内部使用。 然而,需要注意...

    sun.misc.BASE64Encoder.jar

    总的来说,虽然`sun.misc.BASE64Encoder`在某些情况下提供了便捷的BASE64编码功能,但由于其非公开性质和可能的兼容性问题,开发人员应谨慎使用,并考虑采用更稳定的解决方案。在Android开发中,使用`java.util.Base...

    sun.misc.BASE64Decoder.jar最新

    sun.misc.BASE64Decoder.jar sun.misc.BASE64Decoder.jar sun.misc.BASE64Decoder.jar sun.misc.BASE64Decoder.jar

    rt.jar sun.misc.BASE64Encoder

    rt.jar sun.misc.BASE64Encoder

    java开发 sun.misc.BASE64Decoder.jar包下载

    java开发 sun.misc.BASE64Decoder.jar包下载 java开发 sun.misc.BASE64Decoder.jar包下载

    sun.misc.BASE64Decoder.rar

    Intellij-解决报错:import sun.misc.BASE64Decoder无法找到 报错原因:JDK从1.8升级到9.0.1后sun.misc.BASE64Decoder和sun.misc.BASE64Encoder不可用 sun.misc.BASE64Decoder

    sun.misc.BASE64Decoder.zip

    《深入解析Java 7中的sun.misc.BASE64Decoder》 在Java编程中,`sun.misc.BASE64Decoder`是Java 7版本中一个用于解码Base64编码的数据的类。Base64是一种广泛使用的编码方式,它将任意二进制数据转换为可打印的...

    sun.misc.BASE64Decoder

    `sun.misc.BASE64Decoder` 类在Java早期版本中是提供非标准的BASE64解码功能,位于`sun.misc` 包下,这是一个非公开(internal)包,意味着它不是Java公共API的一部分,因此不保证在不同版本的JVM中稳定存在。...

    sun.misc.BASE64Decoder.jar

    《深入解析:Java中的sun.misc.BASE64Decoder及其在Java 8后的变化》 在Java编程语言中,`sun.misc.BASE64Decoder`是用于解码Base64编码字符串的一个类,它属于`sun.misc`包,这个包包含了Java标准库中的一些非公开...

Global site tag (gtag.js) - Google Analytics