<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    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
    太感謝了,謝意無以言表  回復  更多評論
      


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


    網站導航:
     
    主站蜘蛛池模板: a级毛片毛片免费观看永久| 亚洲av午夜电影在线观看| 国产精品免费久久久久影院| 成年在线网站免费观看无广告 | 久久99国产亚洲高清观看首页| 日本高清免费中文在线看| 亚洲成aⅴ人片久青草影院| 永久免费观看黄网站| 久久影院亚洲一区| 特级做A爰片毛片免费看无码| 国产亚洲一区二区三区在线| 日本免费电影一区二区| 亚洲性天天干天天摸| 99re在线视频免费观看| 亚洲精品福利网站| 国产精品成人免费视频网站京东 | 四虎AV永久在线精品免费观看| 久久亚洲精品11p| 亚洲国产精品无码久久九九| a毛片视频免费观看影院| 亚洲制服中文字幕第一区| 真人做A免费观看| va天堂va亚洲va影视中文字幕| 在线jyzzjyzz免费视频| 特级毛片A级毛片免费播放| 亚洲欧洲日产国码无码网站| 毛片无码免费无码播放| 亚洲熟妇自偷自拍另欧美| 免费一区二区视频| a毛片免费全部播放完整成| 亚洲黄色中文字幕| 精品国产免费观看久久久| xvideos永久免费入口| 亚洲视频一区在线观看| 国产a不卡片精品免费观看| 91免费在线视频| 亚洲中文字幕久久精品无码VA| 亚洲伊人成无码综合网| 国产电影午夜成年免费视频| 男男gvh肉在线观看免费| 色噜噜综合亚洲av中文无码|