<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?????}

    出來的結(jié)果是:
    [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%。 轉(zhuǎn)換的時候,將三個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)站導航:
     
    主站蜘蛛池模板: 亚洲精品国产V片在线观看| AV大片在线无码永久免费| 亚洲国产精品嫩草影院久久| 亚洲日韩一中文字暮| 午夜成人免费视频| 亚洲日韩中文字幕无码一区| 在线观看人成视频免费| 亚洲AV无码一区二区三区性色| 四虎影视免费在线| 美女被羞羞网站免费下载| 亚洲成av人片在线观看天堂无码| 极品色天使在线婷婷天堂亚洲| 亚洲成A人片在线观看中文 | 亚洲一区二区三区免费视频 | 国内自产拍自a免费毛片| 亚洲人成人无码.www石榴| 国产青草视频在线观看免费影院| 国产成人亚洲精品蜜芽影院| 国产精品亚洲二区在线观看| 久9热免费精品视频在线观看| 内射干少妇亚洲69XXX| 毛片视频免费观看| 免费一级毛suv好看的国产网站 | 亚洲高清在线mv| 毛片在线免费视频| 一级毛片在播放免费| 亚洲人成在线电影| 处破痛哭A√18成年片免费| 国产精品偷伦视频免费观看了| 亚洲精品高清国产一久久| 免费鲁丝片一级在线观看| 国产免费A∨在线播放| 亚洲第一二三四区| 亚洲Av无码国产情品久久| 老汉精品免费AV在线播放| 亚洲AV无码成人网站在线观看| 国产亚洲精品福利在线无卡一| 日本在线高清免费爱做网站| 无遮挡a级毛片免费看| 亚洲综合色一区二区三区小说| 国产一区视频在线免费观看|