`

重写BASE64Encoder

    博客分类:
  • java
阅读更多
今天发现JDK1.4中的sun.misc.BASE64Encoder有两个问题
1)编码的字节较长时,encode出来的字符窜会在中间插入\n\r
比如
编码"中华人名共和国 呵呵呵呵呵呵呵呵呵呵呵呵呵中华人名共和国 呵呵呵呵呵呵呵呵呵呵呵呵呵"
生成的字符窜居然有两行,中间多了回车换行符。
2)效率较差(见后面的比较)

下面是我的实现:
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();
     }
}

这样运行一个测试程序

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 encoder]use time :4844
[our encoder]use time :2609
差不多慢一倍。
分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    BASE64Encoder.jar

    描述中提到的"sun.misc"包是Java早期提供的一组实用工具类,其中包括了用于Base64编码和解码的`BASE64Encoder`和`BASE64Decoder`类。 1. **Base64编码原理**: Base64编码基于64个可打印字符,这些字符包括大小写...

    BASE64Encoder.zip

    在这个"BASE64Encoder.zip"压缩包中包含了一个名为"BASE64Encoder.jar"的文件,这很可能是一个Java实现的BASE64编码和解码工具。 在Java中,`java.util.Base64`类库提供了对BASE64编码和解码的支持。这个"BASE64...

    base64encoder jar包

    Base64Encoder.jar包是Java开发中用于进行Base64编码和解码的工具包,它可以帮助开发者在处理数据时,将二进制数据转换为可打印的ASCII字符串,反之亦然。在Java标准库中,虽然已经包含了`java.util.Base64`类来执行...

    sun.misc.BASE64Encoder源码及jar包

    在Java编程语言中,`sun.misc.BASE64Encoder`和`BASE64Decoder`是用于进行Base64编码和解码的内部类,它们属于`sun.misc`包,这是一个非公开(非标准)的Java库。`sun.misc`包中的类主要用于JVM内部使用,因此在官方...

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

    在Java编程语言中,`sun.misc.BASE64Encoder` 和 `sun.misc.BASE64Decoder` 是两个用于Base64编码和解码的内部类,它们位于`sun.misc`包下。Base64是一种用于在网络上传输二进制数据的文本编码方式,它将任意的字节...

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

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

    BASE64Encoder 与 BASE64Decoder 源代码

    在Java中,`BASE64Encoder`和`BASE64Decoder`是两个核心类,分别用于对数据进行BASE64编码和解码。 `BASE64Encoder`类: 这个类在Java SDK中位于`javax.crypto`包下,主要负责将字节序列(byte array)转换为BASE...

    sun.misc.BASE64Encoder.jar包

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

    android需要的BASE64Encoder的jar包

    啥都不说了,CSDN都要30多分,抢钱啊,我着急下载,没有那么多分,对那些...android需要的BASE64Encoder的jar包,欢迎大家下载使用,为什么要5分,是因为,为了下载这么个破jar包,我花干了我的分,也是为了凑够字数。

    sun.misc.BASE64Encoder 找不到

    在Java编程中,`sun.misc.BASE64Encoder` 类曾是Java标准库早期版本中用于进行Base64编码的一个工具类。然而,由于这个类属于Sun Microsystems的内部实现细节,自Java 9开始,它被标记为废弃,并在后续版本中逐步...

    BASE64Encoder加密与解密

    然而,需要注意的是,这两个类自JDK 9起已被弃用,建议使用`java.util.Base64`包中的`Base64.getEncoder()`和`Base64.getDecoder()`方法来进行BASE64的编码和解码工作。 #### 示例代码分析 给出的代码示例展示了...

    BASE64Encoder及BASE64Decoder的源码

    `Base64.Encoder`接口代表Base64编码器,而`Base64.Decoder`接口代表Base64解码器。你可以通过`Base64.getEncoder()`和`Base64.getDecoder()`获取默认的编码器和解码器实例。例如: ```java import java.util.Base...

    sun.misc.BASE64Encoder下载

    BASE64Encode 编码,在andorid没有这个编码,这里面有打成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

    在Java平台上,`sun.misc.BASE64Encoder`类被用来实现BASE64编码,但需要注意的是,这个类属于Java的非公开(sun.misc)包,官方并不推荐直接使用。 首先,我们来深入理解一下BASE64编码。BASE64编码是一种基于64个...

    Base64引入包

    在早期的Java版本中,如JDK 1.4及更早版本,可以使用`sun.misc.BASE64Encoder`和`sun.misc.BASE64Decoder`类进行Base64操作,但这些类位于非公开的`sun.misc`包下,不是标准API,使用它们可能引发不兼容性问题,且不...

    BASE64Encoder编码转换

    将BASE64Encoder编码与普通字节的互相转换,很好用!

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

    sun.misc.BASE64Encoder 找不到jar包

Global site tag (gtag.js) - Google Analytics