空間站

          北極心空

            BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
            15 Posts :: 393 Stories :: 160 Comments :: 0 Trackbacks
          /**
          * 我在網上看到過很多BASE64的JavaScript算法,都覺得不滿意,于是自己寫了一個,在這里分享一下。
          * 我的代碼在質量的效率都較高,沒有一些冗余的操作。總體來講我覺得非常不錯。
          * 如果大家有什么不懂的地方可以問我。
          */
          var BASE64={
              
          /**
               * 此變量為編碼的key,每個字符的下標相對應于它所代表的編碼。
               
          */
              enKey: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789
          +/',
              
          /**
               * 此變量為解碼的key,是一個數組,BASE64的字符的ASCII值做下標,所對應的就是該字符所代表的編碼值。
               
          */
              deKey: 
          new Array(
                  
          -1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1,
                  
          -1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1,
                  
          -1-1-1-1-1-1-1-1-1-1-162-1-1-163,
                  
          52535455565758596061-1-1-1-1-1-1,
                  
          -1,  0,  1,  2,  3,  4,  5,  6,  7,  8,  91011121314,
                  
          1516171819202122232425-1-1-1-1-1,
                  
          -1262728293031323334353637383940,
                  
          4142434445464748495051-1-1-1-1-1
              ),
              
          /**
               * 編碼
               
          */
              encode: 
          function(src){
                  
          //用一個數組來存放編碼后的字符,效率比用字符串相加高很多。
                  var str=new Array();
                  
          var ch1, ch2, ch3;
                  
          var pos=0;
                 
          //每三個字符進行編碼。
                  while(pos+3<=src.length){
                      ch1
          =src.charCodeAt(pos++);
                      ch2
          =src.charCodeAt(pos++);
                      ch3
          =src.charCodeAt(pos++);
                      str.push(
          this.enKey.charAt(ch1>>2), this.enKey.charAt(((ch1<<4)+(ch2>>4))&0x3f));
                      str.push(
          this.enKey.charAt(((ch2<<2)+(ch3>>6))&0x3f), this.enKey.charAt(ch3&0x3f));
                  }
                  
          //給剩下的字符進行編碼。
                  if(pos<src.length){
                      ch1
          =src.charCodeAt(pos++);
                      str.push(
          this.enKey.charAt(ch1>>2));
                      
          if(pos<src.length){
                          ch2
          =src.charCodeAt(pos);
                          str.push(
          this.enKey.charAt(((ch1<<4)+(ch2>>4))&0x3f));
                          str.push(
          this.enKey.charAt(ch2<<2&0x3f), '=');
                      }
          else{
                          str.push(
          this.enKey.charAt(ch1<<4&0x3f), '==');
                      }
                  }
                 
          //組合各編碼后的字符,連成一個字符串。
                  return str.join('');
              },
              
          /**
               * 解碼。
               
          */
              decode: 
          function(src){
                  
          //用一個數組來存放解碼后的字符。
                  var str=new Array();
                  
          var ch1, ch2, ch3, ch4;
                  
          var pos=0;
                 
          //過濾非法字符,并去掉'='。
                  src=src.replace(/[^A-Za-z0-9\+\/]/g, '');
                  
          //decode the source string in partition of per four characters.
                  while(pos+4<=src.length){
                      ch1
          =this.deKey[src.charCodeAt(pos++)];
                      ch2
          =this.deKey[src.charCodeAt(pos++)];
                      ch3
          =this.deKey[src.charCodeAt(pos++)];
                      ch4
          =this.deKey[src.charCodeAt(pos++)];
                      str.push(String.fromCharCode(
                          (ch1
          <<2&0xff)+(ch2>>4), (ch2<<4&0xff)+(ch3>>2), (ch3<<6&0xff)+ch4));
                  }
                  
          //給剩下的字符進行解碼。
                  if(pos+1<src.length){
                      ch1
          =this.deKey[src.charCodeAt(pos++)];
                      ch2
          =this.deKey[src.charCodeAt(pos++)];
                      
          if(pos<src.length){
                          ch3
          =this.deKey[src.charCodeAt(pos)];
                          str.push(String.fromCharCode((ch1
          <<2&0xff)+(ch2>>4), (ch2<<4&0xff)+(ch3>>2)));
                      }
          else{
                          str.push(String.fromCharCode((ch1
          <<2&0xff)+(ch2>>4)));
                      }
                  }
                 
          //組合各解碼后的字符,連成一個字符串。
                  return str.join('');
              }
          };

          使用方法:

          var str='hello world!';
          var enstr=BASE64.encode(str);
          alert(enstr);
          var destr=BASE64.decode(enstr);
          alert(destr);
          posted on 2007-07-20 13:00 蘆葦 閱讀(1914) 評論(2)  編輯  收藏 所屬分類: HTML & Script

          Feedback

          # re: JavaScript 的 BASE64 算法 2008-08-01 03:54 ss
          覺得非常不錯。
            回復  更多評論
            

          # re: JavaScript 的 BASE64 算法 2012-07-25 09:35 Lou
          不支持中文!  回復  更多評論
            

          主站蜘蛛池模板: 吴旗县| 汉阴县| 额济纳旗| 株洲市| 崇仁县| 安义县| 华亭县| 乐山市| 大洼县| 襄樊市| 南宫市| 武宁县| 师宗县| 云林县| 通辽市| 那坡县| 珠海市| 武穴市| 巫山县| 理塘县| 临邑县| 丹江口市| 万载县| 泽州县| 海淀区| 贞丰县| 公安县| 东城区| 易门县| 霍邱县| 腾冲县| 福安市| 文山县| 尤溪县| 望谟县| 拜城县| 溧水县| 洪泽县| 谷城县| 蓝田县| 迁西县|