天天看點

用js編解碼base64

編碼規則

Base64編碼的思想是是采用64個基本的ASCII碼字元對資料進行重新編碼。它将需要編碼的資料拆分成位元組數組。以3個位元組為一組。按順序排列24 位資料,再把這24位資料分成4組,即每組6位。再在每組的的最高位前補兩個0湊足一個位元組。這樣就把一個3位元組為一組的資料重新編碼成了4個位元組。當所要編碼的資料的位元組數不是3的整倍數,也就是說在分組時最後一組不夠3個位元組。這時在最後一組填充1到2個0位元組。并在最後編碼完成後在結尾添加1到2個 “=”。

實作的代碼:

1:  //下面是64個基本的編碼      
2:  var base64EncodeChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";      
3:  var base64DecodeChars = new Array(      
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:  function base64encode(str) {      
14:      var out, i, len;      
15:      var c1, 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:      return out;      
44:  }      
45:  //解碼的方法      
46:  function base64decode(str) {      
47:      var c1, c2, c3, c4;      
48:      var i, len, out;      
49:      len = str.length;      
50:      i = 0;      
51:      out = "";      
52:      while(i < len) {      
54:      do {      
55:          c1 = base64DecodeChars[str.charCodeAt(i++) & 0xff];      
56:      } while(i < len && c1 == -1);      
57:      if(c1 == -1)      
58:          break;      
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));      
67:      do {      
68:          c3 = str.charCodeAt(i++) & 0xff;      
69:          if(c3 == 61)      
70:          return out;      
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));      
77:      do {      
78:          c4 = str.charCodeAt(i++) & 0xff;      
79:          if(c4 == 61)      
80:          return out;      
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:      return out;      
88:  }      
89:  function utf16to8(str) {      
90:      var out, 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:      } else if (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:      return out;      
107:  }      
108:  function utf8to16(str) {      
109:      var out, i, len, c;      
110:      var char2, 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:        case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7:      
119:          // 0xxxxxxx      
120:          out += str.charAt(i-1);      
121:          break;      
122:        case 12: case 13:      
123:          // 110x xxxx   10xx xxxx      
124:          char2 = str.charCodeAt(i++);      
125:          out += String.fromCharCode(((c & 0x1F) << 6) | (char2 & 0x3F));      
126:          break;      
127:        case 14:      
128:          // 1110 xxxx  10xx xxxx  10xx xxxx      
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:      return out;      
138:  }      
調用:      
1:  //編碼      
2:  value = base64encode(utf16to8(src))      
3:         
4:  //解碼      
5:  value = utf8to16(base64decode(src))      

轉載于:https://www.cnblogs.com/ricksun/archive/2012/08/27/2658654.html