E81086713E446D36F62B2AA2A3502B5EB155

Java杂家

杂七杂八。。。一家之言

BlogJava 首页 新随笔 联系 聚合 管理
  141 Posts :: 1 Stories :: 174 Comments :: 0 Trackbacks
今天发现JDK1.4中的sun.misc.BASE64Encoder有两个问题
1)编码的字节较长时,encode出来的字符窜会在中间插入\n\r
比如
编码"中华人名共和国 呵呵呵呵呵呵呵呵呵呵呵呵呵中华人名共和国 呵呵呵呵呵呵呵呵呵呵呵呵呵"
生成的字符窜居然有两行,中间多了回车换行符。
2)效率较差(见后面的比较)

下面是我的实现:
 1 /**
 2  * @author yovn
 3  * 
 4  */
 5 public class BASE64Encoder {
 6 
 7     private static char[] codec_table = { 'A''B''C''D''E''F''G',
 8             'H''I''J''K''L''M''N''O''P''Q''R''S''T',
 9             'U''V''W''X''Y''Z''a''b''c''d''e''f''g',
10             'h''i''j''k''l''m''n''o''p''q''r''s''t',
11             'u''v''w''x''y''z''0''1''2''3''4''5''6',
12             '7''8''9''+''/' };
13 
14     public BASE64Encoder() {
15 
16     }
17 
18     public String encode(byte[] a) {
19         int totalBits = a.length * 8;
20         int nn = totalBits % 6;
21         int curPos = 0;// process bits
22         StringBuffer toReturn = new StringBuffer();
23         while (curPos < totalBits) {
24             int bytePos = curPos / 8;
25             switch (curPos % 8) {
26             case 0:
27                 toReturn.append(codec_table[(a[bytePos] & 0xfc>> 2]);
28                 break;
29             case 2:
30 
31                 toReturn.append(codec_table[(a[bytePos] & 0x3f)]);
32                 break;
33             case 4:
34                 if (bytePos == a.length - 1) {
35                     toReturn
36                             .append(codec_table[((a[bytePos] & 0x0f<< 2& 0x3f]);
37                 } else {
38                     int pos = (((a[bytePos] & 0x0f<< 2| ((a[bytePos + 1& 0xc0>> 6)) & 0x3f;
39                     toReturn.append(codec_table[pos]);
40                 }
41                 break;
42             case 6:
43                 if (bytePos == a.length - 1) {
44                     toReturn
45                             .append(codec_table[((a[bytePos] & 0x03<< 4& 0x3f]);
46                 } else {
47                     int pos = (((a[bytePos] & 0x03<< 4| ((a[bytePos + 1& 0xf0>> 4)) & 0x3f;
48                     toReturn.append(codec_table[pos]);
49                 }
50                 break;
51             default:
52                 //never hanppen
53                 break;
54             }
55             curPos+=6;
56         }
57         if(nn==2)
58         {
59             toReturn.append("==");
60         }
61         else if(nn==4)
62         {
63             toReturn.append("=");
64         }
65         return toReturn.toString();
66 
67     }
68 
69 }

这样运行一个测试程序
 1 public static void main(String[] args) throws Exception {
 2         
 3 
 4         BASE64Encoder encoder=new BASE64Encoder();
 5         sun.misc.BASE64Encoder sunEncoder=new sun.misc.BASE64Encoder();
 6         byte[] testBytes=new byte[1024*1024*2];
 7         long start=System.currentTimeMillis();
 8         for(int i=0;i<10;i++)
 9         {
10             sunEncoder.encode(testBytes);
11         }
12         
13         System.out.println("[sun encoder]use time :"+(System.currentTimeMillis()-start));
14         start=System.currentTimeMillis();
15         for(int i=0;i<10;i++)
16         {
17             encoder.encode(testBytes);
18         }
19         
20         System.out.println("[our encoder]use time :"+(System.currentTimeMillis()-start));
21 
22     }

出来的结果是:
[sun encoder]use time :4844
[our encoder]use time :2609
差不多慢一倍。


posted on 2007-01-31 17:03 DoubleH 阅读(6563) 评论(6)  编辑  收藏

Feedback

# re: 重写BASE64Encoder 2007-01-31 20:31 tedeyang
大概一年前我发现sun的BASE64Encoder编码出来字符偶尔会有非BASE64字符,后来改用Weblogic带的BASE64Encoder解决了问题。呵呵,不记得详细情况了,没想到老兄对BASE64Encoder比较了解。赞!  回复  更多评论
  

# re: 重写BASE64Encoder 2007-02-02 13:06 lizongbo
第一个不叫问题,建议了解一下rfc规范.

Base64 - Wikipedia
完整的base64定义可见RFC-1421和RFC-2045。编码后的数据比原始数据略长,为原来的4/3。在电子邮件中,根据RFC822规定,每76个字符,还需要加上一个回车换行。可以估算编码后数据长度大约为原长的135.1%。 转换的时候,将三个byte的数据,先后放入 ...
zh.wikipedia.org/wiki/Base64 - 29k - 网页快照 - 类似网页




  回复  更多评论
  

# re: 重写BASE64Encoder[未登录] 2007-09-27 16:31 legendsen
强。顶。。。
不过我在想为什么要用加号呢?
减号多好呀。。。  回复  更多评论
  

# re: 重写BASE64Encoder 2010-12-30 00:20 liqiang.sun
很强  回复  更多评论
  

# re: 重写BASE64Encoder 2011-06-30 11:06 邢志云
嗯,
我发现sun公司的有2个问题,1是加了回车换行,2是编码大文件(5M)时崩溃,无法运行,直接粘贴了你的,一切正常.
阿弥陀佛,感谢,感谢  回复  更多评论
  

# re: 重写BASE64Encoder[未登录] 2012-07-08 12:02 Lucas
太感谢了,谢意无以言表  回复  更多评论
  


只有注册用户登录后才能发表评论。


网站导航: