E81086713E446D36F62B2AA2A3502B5EB155

          Java雜家

          雜七雜八。。。一家之言

          BlogJava 首頁(yè) 新隨筆 聯(lián)系 聚合 管理
            40 Posts :: 1 Stories :: 174 Comments :: 0 Trackbacks
          今天發(fā)現(xiàn)JDK1.4中的sun.misc.BASE64Encoder有兩個(gè)問題
          1)編碼的字節(jié)較長(zhǎng)時(shí),encode出來的字符竄會(huì)在中間插入\n\r
          比如
          編碼"中華人名共和國(guó) 呵呵呵呵呵呵呵呵呵呵呵呵呵中華人名共和國(guó) 呵呵呵呵呵呵呵呵呵呵呵呵呵"
          生成的字符竄居然有兩行,中間多了回車換行符。
          2)效率較差(見后面的比較)

          下面是我的實(shí)現(xiàn):
          ?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?}

          這樣運(yùn)行一個(gè)測(cè)試程序
          ?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?????}

          出來的結(jié)果是:
          [sun encoder]use time :4844
          [our encoder]use time :2609
          差不多慢一倍。


          posted on 2007-01-31 17:03 DoubleH 閱讀(6591) 評(píng)論(6)  編輯  收藏

          Feedback

          # re: 重寫B(tài)ASE64Encoder 2007-01-31 20:31 tedeyang
          大概一年前我發(fā)現(xiàn)sun的BASE64Encoder編碼出來字符偶爾會(huì)有非BASE64字符,后來改用Weblogic帶的BASE64Encoder解決了問題。呵呵,不記得詳細(xì)情況了,沒想到老兄對(duì)BASE64Encoder比較了解。贊!  回復(fù)  更多評(píng)論
            

          # re: 重寫B(tài)ASE64Encoder 2007-02-02 13:06 lizongbo
          第一個(gè)不叫問題,建議了解一下rfc規(guī)范.

          Base64 - Wikipedia
          完整的base64定義可見RFC-1421和RFC-2045。編碼后的數(shù)據(jù)比原始數(shù)據(jù)略長(zhǎng),為原來的4/3。在電子郵件中,根據(jù)RFC822規(guī)定,每76個(gè)字符,還需要加上一個(gè)回車換行??梢怨浪憔幋a后數(shù)據(jù)長(zhǎng)度大約為原長(zhǎng)的135.1%。 轉(zhuǎn)換的時(shí)候,將三個(gè)byte的數(shù)據(jù),先后放入 ...
          zh.wikipedia.org/wiki/Base64 - 29k - 網(wǎng)頁(yè)快照 - 類似網(wǎng)頁(yè)




            回復(fù)  更多評(píng)論
            

          # re: 重寫B(tài)ASE64Encoder[未登錄] 2007-09-27 16:31 legendsen
          強(qiáng)。頂。。。
          不過我在想為什么要用加號(hào)呢?
          減號(hào)多好呀。。。  回復(fù)  更多評(píng)論
            

          # re: 重寫B(tài)ASE64Encoder 2010-12-30 00:20 liqiang.sun
          很強(qiáng)  回復(fù)  更多評(píng)論
            

          # re: 重寫B(tài)ASE64Encoder 2011-06-30 11:06 邢志云
          嗯,
          我發(fā)現(xiàn)sun公司的有2個(gè)問題,1是加了回車換行,2是編碼大文件(5M)時(shí)崩潰,無法運(yùn)行,直接粘貼了你的,一切正常.
          阿彌陀佛,感謝,感謝  回復(fù)  更多評(píng)論
            

          # re: 重寫B(tài)ASE64Encoder[未登錄] 2012-07-08 12:02 Lucas
          太感謝了,謝意無以言表  回復(fù)  更多評(píng)論
            


          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 云浮市| 满洲里市| 长岛县| 翁源县| 海原县| 麻栗坡县| 镇平县| 萝北县| 弋阳县| 九龙坡区| 特克斯县| 平果县| 万源市| 会宁县| 郯城县| 渝中区| 咸宁市| 西充县| 盐津县| 咸丰县| 南充市| 来凤县| 扬州市| 呼和浩特市| 濮阳县| 延寿县| 延安市| 雷波县| 三明市| 延长县| 宁海县| 内江市| 胶南市| 永善县| 隆林| 南昌市| 永登县| 喀喇沁旗| 武胜县| 大荔县| 镇安县|