<p>用js编解码base64</p><p>编码规则</p><p>Base64编码的思想是是采用64个基本的ASCII码字符对数据进行重新编码。它将需要编码的数据拆分成字节数组。以3个字节为一组。按顺序排列24 位数据,再把这24位数据分成4组,即每组6位。再在每组的的最高位前补两个0凑足一个字节。这样就把一个3字节为一组的数据重新编码成了4个字节。当所要编码的数据的字节数不是3的整倍数,也就是说在分组时最后一组不够3个字节。这时在最后一组填充1到2个0字节。并在最后编码完成后在结尾添加1到2个 "="。</p><p>实现的代码:</p><pre class="brush:js;toolbar:false">1://下面是64个基本的编码
2:varbase64EncodeChars="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
3:varbase64DecodeChars=newArray(
4:-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
5:-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
6:-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,62,-1,-1,-1,63,
7:52,53,54,55,56,57,58,59,60,61,-1,-1,-1,-1,-1,-1,
8:-1,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,
9:15,16,17,18,19,20,21,22,23,24,25,-1,-1,-1,-1,-1,
10:-1,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,
11:41,42,43,44,45,46,47,48,49,50,51,-1,-1,-1,-1,-1);
12://编码的方法
13:functionbase64encode(str){
14:varout,i,len;
15:varc1,c2,c3;
16:len=str.length;
17:i=0;
18:out="";
19:while(i<len){
20:c1=str.charCodeAt(i++)&0xff;
21:if(i==len)
22:{
23:out+=base64EncodeChars.charAt(c1>>2);
24:out+=base64EncodeChars.charAt((c1&0x3)<<4);
25:out+="==";
26:break;
27:}
28:c2=str.charCodeAt(i++);
29:if(i==len)
30:{
31:out+=base64EncodeChars.charAt(c1>>2);
32:out+=base64EncodeChars.charAt(((c1&0x3)<<4)|((c2&0xF0)>>4));
33:out+=base64EncodeChars.charAt((c2&0xF)<<2);
34:out+="=";
35:break;
36:}
37:c3=str.charCodeAt(i++);
38:out+=base64EncodeChars.charAt(c1>>2);
39:out+=base64EncodeChars.charAt(((c1&0x3)<<4)|((c2&0xF0)>>4));
40:out+=base64EncodeChars.charAt(((c2&0xF)<<2)|((c3&0xC0)>>6));
41:out+=base64EncodeChars.charAt(c3&0x3F);
42:}
43:returnout;
44:}
45://解码的方法
46:functionbase64decode(str){
47:varc1,c2,c3,c4;
48:vari,len,out;
49:len=str.length;
50:i=0;
51:out="";
52:while(i<len){
53:
54:do{
55:c1=base64DecodeChars[str.charCodeAt(i++)&0xff];
56:}while(i<len&&c1==-1);
57:if(c1==-1)
58:break;
59:
60:do{
61:c2=base64DecodeChars[str.charCodeAt(i++)&0xff];
62:}while(i<len&&c2==-1);
63:if(c2==-1)
64:break;
65:out+=String.fromCharCode((c1<<2)|((c2&0x30)>>4));
66:
67:do{
68:c3=str.charCodeAt(i++)&0xff;
69:if(c3==61)
70:returnout;
71:c3=base64DecodeChars[c3];
72:}while(i<len&&c3==-1);
73:if(c3==-1)
74:break;
75:out+=String.fromCharCode(((c2&0XF)<<4)|((c3&0x3C)>>2));
76:
77:do{
78:c4=str.charCodeAt(i++)&0xff;
79:if(c4==61)
80:returnout;
81:c4=base64DecodeChars[c4];
82:}while(i<len&&c4==-1);
83:if(c4==-1)
84:break;
85:out+=String.fromCharCode(((c3&0x03)<<6)|c4);
86:}
87:returnout;
88:}
89:functionutf16to8(str){
90:varout,i,len,c;
91:out="";
92:len=str.length;
93:for(i=0;i<len;i++){
94:c=str.charCodeAt(i);
95:if((c>=0x0001)&&(c<=0x007F)){
96:out+=str.charAt(i);
97:}elseif(c>0x07FF){
98:out+=String.fromCharCode(0xE0|((c>>12)&0x0F));
99:out+=String.fromCharCode(0x80|((c>>6)&0x3F));
100:out+=String.fromCharCode(0x80|((c>>0)&0x3F));
101:}else{
102:out+=String.fromCharCode(0xC0|((c>>6)&0x1F));
103:out+=String.fromCharCode(0x80|((c>>0)&0x3F));
104:}
105:}
106:returnout;
107:}
108:functionutf8to16(str){
109:varout,i,len,c;
110:varchar2,char3;
111:out="";
112:len=str.length;
113:i=0;
114:while(i<len){
115:c=str.charCodeAt(i++);
116:switch(c>>4)
117:{
118:case0:case1:case2:case3:case4:case5:case6:case7:
119://0xxxxxxx
120:out+=str.charAt(i-1);
121:break;
122:case12:case13:
123://110xxxxx10xxxxxx
124:char2=str.charCodeAt(i++);
125:out+=String.fromCharCode(((c&0x1F)<<6)|(char2&0x3F));
126:break;
127:case14:
128://1110xxxx10xxxxxx10xxxxxx
129:char2=str.charCodeAt(i++);
130:char3=str.charCodeAt(i++);
131:out+=String.fromCharCode(((c&0x0F)<<12)|
132:((char2&0x3F)<<6)|
133:((char3&0x3F)<<0));
134:break;
135:}
136:}
137:returnout;
138:}</pre><p></p><p>调用:</p><p></p><p> 1: //编码</p><p> 2: value = base64encode(utf16to8(src))</p><p> 3: </p><p> 4: //解码</p><p> 5: value = utf8to16(base64decode(src))</p>