E81086713E446D36F62B2AA2A3502B5EB155

          Java雜家

          雜七雜八。。。一家之言

          BlogJava 首頁 新隨筆 聯系 聚合 管理
            40 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 閱讀(6591) 評論(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
          太感謝了,謝意無以言表  回復  更多評論
            


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 独山县| 侯马市| 黑水县| 大余县| 东宁县| 龙山县| 石台县| 南雄市| 昆山市| 乌拉特中旗| 塔城市| 宁夏| 盖州市| 茶陵县| 老河口市| 建湖县| 磴口县| 曲麻莱县| 隆子县| 迭部县| 阳信县| 建平县| 德江县| 武穴市| 黄骅市| 孝昌县| 永宁县| 周宁县| 汶川县| 靖远县| 茌平县| 安龙县| 榆中县| 邳州市| 枣阳市| 高州市| 铜梁县| 德庆县| 遂平县| 崇左市| 郑州市|