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

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

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

    E81086713E446D36F62B2AA2A3502B5EB155

    Java雜家

    雜七雜八。。。一家之言

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

    下面是我的實現(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?}

    這樣運行一個測試程序
    ?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 閱讀(6589) 評論(6)  編輯  收藏

    Feedback

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

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

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




      回復  更多評論
      

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

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

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

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


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


    網(wǎng)站導航:
     
    主站蜘蛛池模板: 在线观看免费黄网站| 国产美女精品视频免费观看| 亚洲国产一区视频| 91亚洲精品自在在线观看| 中文字幕看片在线a免费| 国产精品嫩草影院免费| 亚洲成AV人片久久| a级毛片免费在线观看| 国产乱子伦精品免费女| 国产精品亚洲精品观看不卡| 老司机69精品成免费视频| 亚洲国产精品自在拍在线播放| 一本色道久久88亚洲精品综合 | 亚洲视频在线免费| 青青草国产免费久久久91| 亚洲无砖砖区免费| 久99久精品免费视频热77| 久久久久亚洲AV综合波多野结衣| 久久亚洲欧美国产精品| 国产男女爽爽爽爽爽免费视频| 亚洲国产成人片在线观看无码| 日韩一级视频免费观看| 亚洲码一区二区三区| 一区二区三区无码视频免费福利| 亚洲高清最新av网站| 亚洲AV无码国产一区二区三区| 1000部拍拍拍18勿入免费视频软件 | 成人免费视频国产| 中文字幕乱码亚洲精品一区| 亚洲成年人免费网站| 亚洲国产精品久久久久婷婷老年| 久久久久久久久久久免费精品| 亚洲av日韩片在线观看| 国产精品亚洲lv粉色| 免费高清资源黄网站在线观看| 色偷偷女男人的天堂亚洲网| 免费可以看黄的视频s色| 亚洲国产精品张柏芝在线观看| 久久99国产综合精品免费| 亚洲视频在线观看一区| 免费福利电影在线观看|