JS实现的base64加密、md5加密及sha1加密详解

1、base64加密

在页面中引入base64.js文件,调用方法为:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

<!DOCTYPE HTML>

<html>

<head>

<meta charset="utf-8">

<title>base64加密</title>

<script type="text/javascript" src="base64.js"></script>

<script type="text/javascript">

  var b = new Base64();

  var str = b.encode("admin:admin");

  alert("base64 encode:" + str);

//解密

  str = b.decode(str);

  alert("base64 decode:" + str);

</script>

</head>

<body>

</body>

</html>

2、md5加密

在页面中引用md5.js文件,调用方法为

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

<!DOCTYPE HTML>

<html>

<head>

<meta charset="utf-8">

<title>md5加密</title>

<script type="text/ecmascript" src="md5.js"></script>

<script type="text/javascript">

 var hash = hex_md5("123dafd");

 alert(hash)

</script>

</head>

<body>

</body>

</html>

3、sha1加密

据说这是最安全的加密

页面中引入sha1.js,调用方法为

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

<!DOCTYPE HTML>

<html>

<head>

<meta charset="utf-8">

<title>sha1加密</title>

<script type="text/ecmascript" src="sha1.js"></script>

<script type="text/javascript">

 var sha = hex_sha1('mima123465')

 alert(sha)

</script>

</head>

<body>

</body>

</html>

一下为js们的源代码

base64.js:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

/**

*

* Base64 encode / decode

*

* @author haitao.tu

* @date 2010-04-26

* @email [email protected]

*

*/

function Base64() {

 // private property

 _keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";

 // public method for encoding

 this.encode = function (input) {

  var output = "";

  var chr1, chr2, chr3, enc1, enc2, enc3, enc4;

  var i = 0;

  input = _utf8_encode(input);

  while (i < input.length) {

   chr1 = input.charCodeAt(i++);

   chr2 = input.charCodeAt(i++);

   chr3 = input.charCodeAt(i++);

   enc1 = chr1 >> 2;

   enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);

   enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);

   enc4 = chr3 & 63;

   if (isNaN(chr2)) {

    enc3 = enc4 = 64;

   } else if (isNaN(chr3)) {

    enc4 = 64;

   }

   output = output +

   _keyStr.charAt(enc1) + _keyStr.charAt(enc2) +

   _keyStr.charAt(enc3) + _keyStr.charAt(enc4);

  }

  return output;

 }

 // public method for decoding

 this.decode = function (input) {

  var output = "";

  var chr1, chr2, chr3;

  var enc1, enc2, enc3, enc4;

  var i = 0;

  input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");

  while (i < input.length) {

   enc1 = _keyStr.indexOf(input.charAt(i++));

   enc2 = _keyStr.indexOf(input.charAt(i++));

   enc3 = _keyStr.indexOf(input.charAt(i++));

   enc4 = _keyStr.indexOf(input.charAt(i++));

   chr1 = (enc1 << 2) | (enc2 >> 4);

   chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);

   chr3 = ((enc3 & 3) << 6) | enc4;

   output = output + String.fromCharCode(chr1);

   if (enc3 != 64) {

    output = output + String.fromCharCode(chr2);

   }

   if (enc4 != 64) {

    output = output + String.fromCharCode(chr3);

   }

  }

  output = _utf8_decode(output);

  return output;

 }

 // private method for UTF-8 encoding

 _utf8_encode = function (string) {

  string = string.replace(/\r\n/g,"\n");

  var utftext = "";

  for (var n = 0; n < string.length; n++) {

   var c = string.charCodeAt(n);

   if (c < 128) {

    utftext += String.fromCharCode(c);

   } else if((c > 127) && (c < 2048)) {

    utftext += String.fromCharCode((c >> 6) | 192);

    utftext += String.fromCharCode((c & 63) | 128);

   } else {

    utftext += String.fromCharCode((c >> 12) | 224);

    utftext += String.fromCharCode(((c >> 6) & 63) | 128);

    utftext += String.fromCharCode((c & 63) | 128);

   }

  }

  return utftext;

 }

 // private method for UTF-8 decoding

 _utf8_decode = function (utftext) {

  var string = "";

  var i = 0;

  var c = c1 = c2 = 0;

  while ( i < utftext.length ) {

   c = utftext.charCodeAt(i);

   if (c < 128) {

    string += String.fromCharCode(c);

    i++;

   } else if((c > 191) && (c < 224)) {

    c2 = utftext.charCodeAt(i+1);

    string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));

    i += 2;

   } else {

    c2 = utftext.charCodeAt(i+1);

    c3 = utftext.charCodeAt(i+2);

    string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));

    i += 3;

   }

  }

  return string;

 }

}

MD5.js:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

199

200

201

202

203

204

205

206

207

208

209

210

211

212

213

214

215

216

217

218

219

220

221

222

223

224

225

226

227

228

229

230

231

232

233

234

/*

 * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message

 * Digest Algorithm, as defined in RFC 1321.

 * Version 2.1 Copyright (C) Paul Johnston 1999 - 2002.

 * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet

 * Distributed under the BSD License

 * See http://pajhome.org.uk/crypt/md5 for more info.

 */

/*

 * Configurable variables. You may need to tweak these to be compatible with

 * the server-side, but the defaults work in most cases.

 */

var hexcase = 0; /* hex output format. 0 - lowercase; 1 - uppercase  */

var b64pad = ""; /* base-64 pad character. "=" for strict RFC compliance */

var chrsz = 8; /* bits per input character. 8 - ASCII; 16 - Unicode  */

/*

 * These are the functions you'll usually want to call

 * They take string arguments and return either hex or base-64 encoded strings

 */

function hex_md5(s){ return binl2hex(core_md5(str2binl(s), s.length * chrsz));}

function b64_md5(s){ return binl2b64(core_md5(str2binl(s), s.length * chrsz));}

function str_md5(s){ return binl2str(core_md5(str2binl(s), s.length * chrsz));}

function hex_hmac_md5(key, data) { return binl2hex(core_hmac_md5(key, data)); }

function b64_hmac_md5(key, data) { return binl2b64(core_hmac_md5(key, data)); }

function str_hmac_md5(key, data) { return binl2str(core_hmac_md5(key, data)); }

/*

 * Perform a simple self-test to see if the VM is working

 */

function md5_vm_test()

{

 return hex_md5("abc") == "900150983cd24fb0d6963f7d28e17f72";

}

/*

 * Calculate the MD5 of an array of little-endian words, and a bit length

 */

function core_md5(x, len)

{

 /* append padding */

 x[len >> 5] |= 0x80 << ((len) % 32);

 x[(((len + 64) >>> 9) << 4) + 14] = len;

 var a = 1732584193;

 var b = -271733879;

 var c = -1732584194;

 var d = 271733878;

 for(var i = 0; i < x.length; i += 16)

 {

 var olda = a;

 var oldb = b;

 var oldc = c;

 var oldd = d;

 a = md5_ff(a, b, c, d, x[i+ 0], 7 , -680876936);

 d = md5_ff(d, a, b, c, x[i+ 1], 12, -389564586);

 c = md5_ff(c, d, a, b, x[i+ 2], 17, 606105819);

 b = md5_ff(b, c, d, a, x[i+ 3], 22, -1044525330);

 a = md5_ff(a, b, c, d, x[i+ 4], 7 , -176418897);

 d = md5_ff(d, a, b, c, x[i+ 5], 12, 1200080426);

 c = md5_ff(c, d, a, b, x[i+ 6], 17, -1473231341);

 b = md5_ff(b, c, d, a, x[i+ 7], 22, -45705983);

 a = md5_ff(a, b, c, d, x[i+ 8], 7 , 1770035416);

 d = md5_ff(d, a, b, c, x[i+ 9], 12, -1958414417);

 c = md5_ff(c, d, a, b, x[i+10], 17, -42063);

 b = md5_ff(b, c, d, a, x[i+11], 22, -1990404162);

 a = md5_ff(a, b, c, d, x[i+12], 7 , 1804603682);

 d = md5_ff(d, a, b, c, x[i+13], 12, -40341101);

 c = md5_ff(c, d, a, b, x[i+14], 17, -1502002290);

 b = md5_ff(b, c, d, a, x[i+15], 22, 1236535329);

 a = md5_gg(a, b, c, d, x[i+ 1], 5 , -165796510);

 d = md5_gg(d, a, b, c, x[i+ 6], 9 , -1069501632);

 c = md5_gg(c, d, a, b, x[i+11], 14, 643717713);

 b = md5_gg(b, c, d, a, x[i+ 0], 20, -373897302);

 a = md5_gg(a, b, c, d, x[i+ 5], 5 , -701558691);

 d = md5_gg(d, a, b, c, x[i+10], 9 , 38016083);

 c = md5_gg(c, d, a, b, x[i+15], 14, -660478335);

 b = md5_gg(b, c, d, a, x[i+ 4], 20, -405537848);

 a = md5_gg(a, b, c, d, x[i+ 9], 5 , 568446438);

 d = md5_gg(d, a, b, c, x[i+14], 9 , -1019803690);

 c = md5_gg(c, d, a, b, x[i+ 3], 14, -187363961);

 b = md5_gg(b, c, d, a, x[i+ 8], 20, 1163531501);

 a = md5_gg(a, b, c, d, x[i+13], 5 , -1444681467);

 d = md5_gg(d, a, b, c, x[i+ 2], 9 , -51403784);

 c = md5_gg(c, d, a, b, x[i+ 7], 14, 1735328473);

 b = md5_gg(b, c, d, a, x[i+12], 20, -1926607734);

 a = md5_hh(a, b, c, d, x[i+ 5], 4 , -378558);

 d = md5_hh(d, a, b, c, x[i+ 8], 11, -2022574463);

 c = md5_hh(c, d, a, b, x[i+11], 16, 1839030562);

 b = md5_hh(b, c, d, a, x[i+14], 23, -35309556);

 a = md5_hh(a, b, c, d, x[i+ 1], 4 , -1530992060);

 d = md5_hh(d, a, b, c, x[i+ 4], 11, 1272893353);

 c = md5_hh(c, d, a, b, x[i+ 7], 16, -155497632);

 b = md5_hh(b, c, d, a, x[i+10], 23, -1094730640);

 a = md5_hh(a, b, c, d, x[i+13], 4 , 681279174);

 d = md5_hh(d, a, b, c, x[i+ 0], 11, -358537222);

 c = md5_hh(c, d, a, b, x[i+ 3], 16, -722521979);

 b = md5_hh(b, c, d, a, x[i+ 6], 23, 76029189);

 a = md5_hh(a, b, c, d, x[i+ 9], 4 , -640364487);

 d = md5_hh(d, a, b, c, x[i+12], 11, -421815835);

 c = md5_hh(c, d, a, b, x[i+15], 16, 530742520);

 b = md5_hh(b, c, d, a, x[i+ 2], 23, -995338651);

 a = md5_ii(a, b, c, d, x[i+ 0], 6 , -198630844);

 d = md5_ii(d, a, b, c, x[i+ 7], 10, 1126891415);

 c = md5_ii(c, d, a, b, x[i+14], 15, -1416354905);

 b = md5_ii(b, c, d, a, x[i+ 5], 21, -57434055);

 a = md5_ii(a, b, c, d, x[i+12], 6 , 1700485571);

 d = md5_ii(d, a, b, c, x[i+ 3], 10, -1894986606);

 c = md5_ii(c, d, a, b, x[i+10], 15, -1051523);

 b = md5_ii(b, c, d, a, x[i+ 1], 21, -2054922799);

 a = md5_ii(a, b, c, d, x[i+ 8], 6 , 1873313359);

 d = md5_ii(d, a, b, c, x[i+15], 10, -30611744);

 c = md5_ii(c, d, a, b, x[i+ 6], 15, -1560198380);

 b = md5_ii(b, c, d, a, x[i+13], 21, 1309151649);

 a = md5_ii(a, b, c, d, x[i+ 4], 6 , -145523070);

 d = md5_ii(d, a, b, c, x[i+11], 10, -1120210379);

 c = md5_ii(c, d, a, b, x[i+ 2], 15, 718787259);

 b = md5_ii(b, c, d, a, x[i+ 9], 21, -343485551);

 a = safe_add(a, olda);

 b = safe_add(b, oldb);

 c = safe_add(c, oldc);

 d = safe_add(d, oldd);

 }

 return Array(a, b, c, d);

}

/*

 * These functions implement the four basic operations the algorithm uses.

 */

function md5_cmn(q, a, b, x, s, t)

{

 return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s),b);

}

function md5_ff(a, b, c, d, x, s, t)

{

 return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t);

}

function md5_gg(a, b, c, d, x, s, t)

{

 return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t);

}

function md5_hh(a, b, c, d, x, s, t)

{

 return md5_cmn(b ^ c ^ d, a, b, x, s, t);

}

function md5_ii(a, b, c, d, x, s, t)

{

 return md5_cmn(c ^ (b | (~d)), a, b, x, s, t);

}

/*

 * Calculate the HMAC-MD5, of a key and some data

 */

function core_hmac_md5(key, data)

{

 var bkey = str2binl(key);

 if(bkey.length > 16) bkey = core_md5(bkey, key.length * chrsz);

 var ipad = Array(16), opad = Array(16);

 for(var i = 0; i < 16; i++)

 {

 ipad[i] = bkey[i] ^ 0x36363636;

 opad[i] = bkey[i] ^ 0x5C5C5C5C;

 }

 var hash = core_md5(ipad.concat(str2binl(data)), 512 + data.length * chrsz);

 return core_md5(opad.concat(hash), 512 + 128);

}

/*

 * Add integers, wrapping at 2^32. This uses 16-bit operations internally

 * to work around bugs in some JS interpreters.

 */

function safe_add(x, y)

{

 var lsw = (x & 0xFFFF) + (y & 0xFFFF);

 var msw = (x >> 16) + (y >> 16) + (lsw >> 16);

 return (msw << 16) | (lsw & 0xFFFF);

}

/*

 * Bitwise rotate a 32-bit number to the left.

 */

function bit_rol(num, cnt)

{

 return (num << cnt) | (num >>> (32 - cnt));

}

/*

 * Convert a string to an array of little-endian words

 * If chrsz is ASCII, characters >255 have their hi-byte silently ignored.

 */

function str2binl(str)

{

 var bin = Array();

 var mask = (1 << chrsz) - 1;

 for(var i = 0; i < str.length * chrsz; i += chrsz)

 bin[i>>5] |= (str.charCodeAt(i / chrsz) & mask) << (i%32);

 return bin;

}

/*

 * Convert an array of little-endian words to a string

 */

function binl2str(bin)

{

 var str = "";

 var mask = (1 << chrsz) - 1;

 for(var i = 0; i < bin.length * 32; i += chrsz)

 str += String.fromCharCode((bin[i>>5] >>> (i % 32)) & mask);

 return str;

}

/*

 * Convert an array of little-endian words to a hex string.

 */

function binl2hex(binarray)

{

 var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef";

 var str = "";

 for(var i = 0; i < binarray.length * 4; i++)

 {

 str += hex_tab.charAt((binarray[i>>2] >> ((i%4)*8+4)) & 0xF) +

   hex_tab.charAt((binarray[i>>2] >> ((i%4)*8 )) & 0xF);

 }

 return str;

}

/*

 * Convert an array of little-endian words to a base-64 string

 */

function binl2b64(binarray)

{

 var tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

 var str = "";

 for(var i = 0; i < binarray.length * 4; i += 3)

 {

 var triplet = (((binarray[i >> 2] >> 8 * ( i %4)) & 0xFF) << 16)

    | (((binarray[i+1 >> 2] >> 8 * ((i+1)%4)) & 0xFF) << 8 )

    | ((binarray[i+2 >> 2] >> 8 * ((i+2)%4)) & 0xFF);

 for(var j = 0; j < 4; j++)

 {

  if(i * 8 + j * 6 > binarray.length * 32) str += b64pad;

  else str += tab.charAt((triplet >> 6*(3-j)) & 0x3F);

 }

 }

 return str;

}

 * A JavaScript implementation of the Secure Hash Algorithm, SHA-1, as defined

 * in FIPS PUB 180-1

 * Version 2.1-BETA Copyright Paul Johnston 2000 - 2002.

 * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet

 * Distributed under the BSD License

 * See http://pajhome.org.uk/crypt/md5 for details.

 */

/*

 * Configurable variables. You may need to tweak these to be compatible with

 * the server-side, but the defaults work in most cases.

 */

var hexcase = 0; /* hex output format. 0 - lowercase; 1 - uppercase     */

var b64pad = ""; /* base-64 pad character. "=" for strict RFC compliance  */

var chrsz = 8; /* bits per input character. 8 - ASCII; 16 - Unicode    */

/*

 * These are the functions you'll usually want to call

 * They take string arguments and return either hex or base-64 encoded strings

 */

function hex_sha1(s) {

 return binb2hex(core_sha1(str2binb(s), s.length * chrsz));

}

function b64_sha1(s) {

 return binb2b64(core_sha1(str2binb(s), s.length * chrsz));

}

function str_sha1(s) {

 return binb2str(core_sha1(str2binb(s), s.length * chrsz));

}

function hex_hmac_sha1(key, data) {

 return binb2hex(core_hmac_sha1(key, data));

}

function b64_hmac_sha1(key, data) {

 return binb2b64(core_hmac_sha1(key, data));

}

function str_hmac_sha1(key, data) {

 return binb2str(core_hmac_sha1(key, data));

}

/*

 * Perform a simple self-test to see if the VM is working

 */

function sha1_vm_test() {

 return hex_sha1("abc") == "a9993e364706816aba3e25717850c26c9cd0d89d";

}

/*

 * Calculate the SHA-1 of an array of big-endian words, and a bit length

 */

function core_sha1(x, len) {

 /* append padding */

 x[len >> 5] |= 0x80 << (24 - len % 32);

 x[((len + 64 >> 9) << 4) + 15] = len;

 var w = Array(80);

 var a = 1732584193;

 var b = -271733879;

 var c = -1732584194;

 var d = 271733878;

 var e = -1009589776;

 for (var i = 0; i < x.length; i += 16) {

  var olda = a;

  var oldb = b;

  var oldc = c;

  var oldd = d;

  var olde = e;

  for (var j = 0; j < 80; j++) {

   if (j < 16) w[j] = x[i + j];

   else w[j] = rol(w[j - 3] ^ w[j - 8] ^ w[j - 14] ^ w[j - 16], 1);

   var t = safe_add(safe_add(rol(a, 5), sha1_ft(j, b, c, d)), safe_add(safe_add(e, w[j]), sha1_kt(j)));

   e = d;

   d = c;

   c = rol(b, 30);

   b = a;

   a = t;

  }

  a = safe_add(a, olda);

  b = safe_add(b, oldb);

  c = safe_add(c, oldc);

  d = safe_add(d, oldd);

  e = safe_add(e, olde);

 }

 return Array(a, b, c, d, e);

}

/*

 * Perform the appropriate triplet combination function for the current

 * iteration

 */

function sha1_ft(t, b, c, d) {

 if (t < 20) return (b & c) | ((~b) & d);

 if (t < 40) return b ^ c ^ d;

 if (t < 60) return (b & c) | (b & d) | (c & d);

 return b ^ c ^ d;

}

/*

 * Determine the appropriate additive constant for the current iteration

 */

function sha1_kt(t) {

 return (t < 20) ? 1518500249 : (t < 40) ? 1859775393 : (t < 60) ? -1894007588 : -899497514;

}

/*

 * Calculate the HMAC-SHA1 of a key and some data

 */

function core_hmac_sha1(key, data) {

 var bkey = str2binb(key);

 if (bkey.length > 16) bkey = core_sha1(bkey, key.length * chrsz);

 var ipad = Array(16),

  opad = Array(16);

 for (var i = 0; i < 16; i++) {

  ipad[i] = bkey[i] ^ 0x36363636;

  opad[i] = bkey[i] ^ 0x5C5C5C5C;

 }

 var hash = core_sha1(ipad.concat(str2binb(data)), 512 + data.length * chrsz);

 return core_sha1(opad.concat(hash), 512 + 160);

}

/*

 * Add integers, wrapping at 2^32. This uses 16-bit operations internally

 * to work around bugs in some JS interpreters.

 */

function safe_add(x, y) {

 var lsw = (x & 0xFFFF) + (y & 0xFFFF);

 var msw = (x >> 16) + (y >> 16) + (lsw >> 16);

 return (msw << 16) | (lsw & 0xFFFF);

}

/*

 * Bitwise rotate a 32-bit number to the left.

 */

function rol(num, cnt) {

 return (num << cnt) | (num >>> (32 - cnt));

}

/*

 * Convert an 8-bit or 16-bit string to an array of big-endian words

 * In 8-bit function, characters >255 have their hi-byte silently ignored.

 */

function str2binb(str) {

 var bin = Array();

 var mask = (1 << chrsz) - 1;

 for (var i = 0; i < str.length * chrsz; i += chrsz)

 bin[i >> 5] |= (str.charCodeAt(i / chrsz) & mask) << (24 - i % 32);

 return bin;

}

/*

 * Convert an array of big-endian words to a string

 */

function binb2str(bin) {

 var str = "";

 var mask = (1 << chrsz) - 1;

 for (var i = 0; i < bin.length * 32; i += chrsz)

 str += String.fromCharCode((bin[i >> 5] >>> (24 - i % 32)) & mask);

 return str;

}

/*

 * Convert an array of big-endian words to a hex string.

 */

function binb2hex(binarray) {

 var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef";

 var str = "";

 for (var i = 0; i < binarray.length * 4; i++) {

  str += hex_tab.charAt((binarray[i >> 2] >> ((3 - i % 4) * 8 + 4)) & 0xF) + hex_tab.charAt((binarray[i >> 2] >> ((3 - i % 4) * 8)) & 0xF);

 }

 return str;

}

/*

 * Convert an array of big-endian words to a base-64 string

 */

function binb2b64(binarray) {

 var tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

 var str = "";

 for (var i = 0; i < binarray.length * 4; i += 3) {

  var triplet = (((binarray[i >> 2] >> 8 * (3 - i % 4)) & 0xFF) << 16) | (((binarray[i + 1 >> 2] >> 8 * (3 - (i + 1) % 4)) & 0xFF) << 8) | ((binarray[i + 2 >> 2] >> 8 * (3 - (i + 2) % 4)) & 0xFF);

  for (var j = 0; j < 4; j++) {

   if (i * 8 + j * 6 > binarray.length * 32) str += b64pad;

   else str += tab.charAt((triplet >> 6 * (3 - j)) & 0x3F);

  }

 }

 return str;

}

猜你喜欢

转载自my.oschina.net/u/3257418/blog/1587393
今日推荐