base32.js 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451
  1. /*
  2. * [hi-base32]{@link https://github.com/emn178/hi-base32}
  3. *
  4. * @version 0.5.0
  5. * @author Chen, Yi-Cyuan [emn178@gmail.com]
  6. * @copyright Chen, Yi-Cyuan 2015-2018
  7. * @license MIT
  8. */
  9. /*jslint bitwise: true */
  10. (function () {
  11. 'use strict';
  12. var root = typeof window === 'object' ? window : {};
  13. var NODE_JS = !root.HI_BASE32_NO_NODE_JS && typeof process === 'object' && process.versions && process.versions.node;
  14. if (NODE_JS) {
  15. root = global;
  16. }
  17. var COMMON_JS = !root.HI_BASE32_NO_COMMON_JS && typeof module === 'object' && module.exports;
  18. var AMD = typeof define === 'function' && define.amd;
  19. var BASE32_ENCODE_CHAR = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567'.split('');
  20. var BASE32_DECODE_CHAR = {
  21. 'A': 0, 'B': 1, 'C': 2, 'D': 3, 'E': 4, 'F': 5, 'G': 6, 'H': 7, 'I': 8,
  22. 'J': 9, 'K': 10, 'L': 11, 'M': 12, 'N': 13, 'O': 14, 'P': 15, 'Q': 16,
  23. 'R': 17, 'S': 18, 'T': 19, 'U': 20, 'V': 21, 'W': 22, 'X': 23, 'Y': 24,
  24. 'Z': 25, '2': 26, '3': 27, '4': 28, '5': 29, '6': 30, '7': 31
  25. };
  26. var blocks = [0, 0, 0, 0, 0, 0, 0, 0];
  27. var throwInvalidUtf8 = function (position, partial) {
  28. if (partial.length > 10) {
  29. partial = '...' + partial.substr(-10);
  30. }
  31. var err = new Error('Decoded data is not valid UTF-8.'
  32. + ' Maybe try base32.decode.asBytes()?'
  33. + ' Partial data after reading ' + position + ' bytes: ' + partial + ' <-');
  34. err.position = position;
  35. throw err;
  36. };
  37. var toUtf8String = function (bytes) {
  38. var str = '', length = bytes.length, i = 0, followingChars = 0, b, c;
  39. while (i < length) {
  40. b = bytes[i++];
  41. if (b <= 0x7F) {
  42. str += String.fromCharCode(b);
  43. continue;
  44. } else if (b > 0xBF && b <= 0xDF) {
  45. c = b & 0x1F;
  46. followingChars = 1;
  47. } else if (b <= 0xEF) {
  48. c = b & 0x0F;
  49. followingChars = 2;
  50. } else if (b <= 0xF7) {
  51. c = b & 0x07;
  52. followingChars = 3;
  53. } else {
  54. throwInvalidUtf8(i, str);
  55. }
  56. for (var j = 0; j < followingChars; ++j) {
  57. b = bytes[i++];
  58. if (b < 0x80 || b > 0xBF) {
  59. throwInvalidUtf8(i, str);
  60. }
  61. c <<= 6;
  62. c += b & 0x3F;
  63. }
  64. if (c >= 0xD800 && c <= 0xDFFF) {
  65. throwInvalidUtf8(i, str);
  66. }
  67. if (c > 0x10FFFF) {
  68. throwInvalidUtf8(i, str);
  69. }
  70. if (c <= 0xFFFF) {
  71. str += String.fromCharCode(c);
  72. } else {
  73. c -= 0x10000;
  74. str += String.fromCharCode((c >> 10) + 0xD800);
  75. str += String.fromCharCode((c & 0x3FF) + 0xDC00);
  76. }
  77. }
  78. return str;
  79. };
  80. var decodeAsBytes = function (base32Str) {
  81. if (!/^[A-Z2-7=]+$/.test(base32Str)) {
  82. throw new Error('Invalid base32 characters');
  83. }
  84. base32Str = base32Str.replace(/=/g, '');
  85. var v1, v2, v3, v4, v5, v6, v7, v8, bytes = [], index = 0, length = base32Str.length;
  86. // 4 char to 3 bytes
  87. for (var i = 0, count = length >> 3 << 3; i < count;) {
  88. v1 = BASE32_DECODE_CHAR[base32Str.charAt(i++)];
  89. v2 = BASE32_DECODE_CHAR[base32Str.charAt(i++)];
  90. v3 = BASE32_DECODE_CHAR[base32Str.charAt(i++)];
  91. v4 = BASE32_DECODE_CHAR[base32Str.charAt(i++)];
  92. v5 = BASE32_DECODE_CHAR[base32Str.charAt(i++)];
  93. v6 = BASE32_DECODE_CHAR[base32Str.charAt(i++)];
  94. v7 = BASE32_DECODE_CHAR[base32Str.charAt(i++)];
  95. v8 = BASE32_DECODE_CHAR[base32Str.charAt(i++)];
  96. bytes[index++] = (v1 << 3 | v2 >>> 2) & 255;
  97. bytes[index++] = (v2 << 6 | v3 << 1 | v4 >>> 4) & 255;
  98. bytes[index++] = (v4 << 4 | v5 >>> 1) & 255;
  99. bytes[index++] = (v5 << 7 | v6 << 2 | v7 >>> 3) & 255;
  100. bytes[index++] = (v7 << 5 | v8) & 255;
  101. }
  102. // remain bytes
  103. var remain = length - count;
  104. if (remain === 2) {
  105. v1 = BASE32_DECODE_CHAR[base32Str.charAt(i++)];
  106. v2 = BASE32_DECODE_CHAR[base32Str.charAt(i++)];
  107. bytes[index++] = (v1 << 3 | v2 >>> 2) & 255;
  108. } else if (remain === 4) {
  109. v1 = BASE32_DECODE_CHAR[base32Str.charAt(i++)];
  110. v2 = BASE32_DECODE_CHAR[base32Str.charAt(i++)];
  111. v3 = BASE32_DECODE_CHAR[base32Str.charAt(i++)];
  112. v4 = BASE32_DECODE_CHAR[base32Str.charAt(i++)];
  113. bytes[index++] = (v1 << 3 | v2 >>> 2) & 255;
  114. bytes[index++] = (v2 << 6 | v3 << 1 | v4 >>> 4) & 255;
  115. } else if (remain === 5) {
  116. v1 = BASE32_DECODE_CHAR[base32Str.charAt(i++)];
  117. v2 = BASE32_DECODE_CHAR[base32Str.charAt(i++)];
  118. v3 = BASE32_DECODE_CHAR[base32Str.charAt(i++)];
  119. v4 = BASE32_DECODE_CHAR[base32Str.charAt(i++)];
  120. v5 = BASE32_DECODE_CHAR[base32Str.charAt(i++)];
  121. bytes[index++] = (v1 << 3 | v2 >>> 2) & 255;
  122. bytes[index++] = (v2 << 6 | v3 << 1 | v4 >>> 4) & 255;
  123. bytes[index++] = (v4 << 4 | v5 >>> 1) & 255;
  124. } else if (remain === 7) {
  125. v1 = BASE32_DECODE_CHAR[base32Str.charAt(i++)];
  126. v2 = BASE32_DECODE_CHAR[base32Str.charAt(i++)];
  127. v3 = BASE32_DECODE_CHAR[base32Str.charAt(i++)];
  128. v4 = BASE32_DECODE_CHAR[base32Str.charAt(i++)];
  129. v5 = BASE32_DECODE_CHAR[base32Str.charAt(i++)];
  130. v6 = BASE32_DECODE_CHAR[base32Str.charAt(i++)];
  131. v7 = BASE32_DECODE_CHAR[base32Str.charAt(i++)];
  132. bytes[index++] = (v1 << 3 | v2 >>> 2) & 255;
  133. bytes[index++] = (v2 << 6 | v3 << 1 | v4 >>> 4) & 255;
  134. bytes[index++] = (v4 << 4 | v5 >>> 1) & 255;
  135. bytes[index++] = (v5 << 7 | v6 << 2 | v7 >>> 3) & 255;
  136. }
  137. return bytes;
  138. };
  139. var encodeAscii = function (str) {
  140. var v1, v2, v3, v4, v5, base32Str = '', length = str.length;
  141. for (var i = 0, count = parseInt(length / 5) * 5; i < count;) {
  142. v1 = str.charCodeAt(i++);
  143. v2 = str.charCodeAt(i++);
  144. v3 = str.charCodeAt(i++);
  145. v4 = str.charCodeAt(i++);
  146. v5 = str.charCodeAt(i++);
  147. base32Str += BASE32_ENCODE_CHAR[v1 >>> 3] +
  148. BASE32_ENCODE_CHAR[(v1 << 2 | v2 >>> 6) & 31] +
  149. BASE32_ENCODE_CHAR[(v2 >>> 1) & 31] +
  150. BASE32_ENCODE_CHAR[(v2 << 4 | v3 >>> 4) & 31] +
  151. BASE32_ENCODE_CHAR[(v3 << 1 | v4 >>> 7) & 31] +
  152. BASE32_ENCODE_CHAR[(v4 >>> 2) & 31] +
  153. BASE32_ENCODE_CHAR[(v4 << 3 | v5 >>> 5) & 31] +
  154. BASE32_ENCODE_CHAR[v5 & 31];
  155. }
  156. // remain char
  157. var remain = length - count;
  158. if (remain === 1) {
  159. v1 = str.charCodeAt(i);
  160. base32Str += BASE32_ENCODE_CHAR[v1 >>> 3] +
  161. BASE32_ENCODE_CHAR[(v1 << 2) & 31] +
  162. '======';
  163. } else if (remain === 2) {
  164. v1 = str.charCodeAt(i++);
  165. v2 = str.charCodeAt(i);
  166. base32Str += BASE32_ENCODE_CHAR[v1 >>> 3] +
  167. BASE32_ENCODE_CHAR[(v1 << 2 | v2 >>> 6) & 31] +
  168. BASE32_ENCODE_CHAR[(v2 >>> 1) & 31] +
  169. BASE32_ENCODE_CHAR[(v2 << 4) & 31] +
  170. '====';
  171. } else if (remain === 3) {
  172. v1 = str.charCodeAt(i++);
  173. v2 = str.charCodeAt(i++);
  174. v3 = str.charCodeAt(i);
  175. base32Str += BASE32_ENCODE_CHAR[v1 >>> 3] +
  176. BASE32_ENCODE_CHAR[(v1 << 2 | v2 >>> 6) & 31] +
  177. BASE32_ENCODE_CHAR[(v2 >>> 1) & 31] +
  178. BASE32_ENCODE_CHAR[(v2 << 4 | v3 >>> 4) & 31] +
  179. BASE32_ENCODE_CHAR[(v3 << 1) & 31] +
  180. '===';
  181. } else if (remain === 4) {
  182. v1 = str.charCodeAt(i++);
  183. v2 = str.charCodeAt(i++);
  184. v3 = str.charCodeAt(i++);
  185. v4 = str.charCodeAt(i);
  186. base32Str += BASE32_ENCODE_CHAR[v1 >>> 3] +
  187. BASE32_ENCODE_CHAR[(v1 << 2 | v2 >>> 6) & 31] +
  188. BASE32_ENCODE_CHAR[(v2 >>> 1) & 31] +
  189. BASE32_ENCODE_CHAR[(v2 << 4 | v3 >>> 4) & 31] +
  190. BASE32_ENCODE_CHAR[(v3 << 1 | v4 >>> 7) & 31] +
  191. BASE32_ENCODE_CHAR[(v4 >>> 2) & 31] +
  192. BASE32_ENCODE_CHAR[(v4 << 3) & 31] +
  193. '=';
  194. }
  195. return base32Str;
  196. };
  197. var encodeUtf8 = function (str) {
  198. var v1, v2, v3, v4, v5, code, end = false, base32Str = '',
  199. index = 0, i, start = 0, bytes = 0, length = str.length;
  200. do {
  201. blocks[0] = blocks[5];
  202. blocks[1] = blocks[6];
  203. blocks[2] = blocks[7];
  204. for (i = start; index < length && i < 5; ++index) {
  205. code = str.charCodeAt(index);
  206. if (code < 0x80) {
  207. blocks[i++] = code;
  208. } else if (code < 0x800) {
  209. blocks[i++] = 0xc0 | (code >> 6);
  210. blocks[i++] = 0x80 | (code & 0x3f);
  211. } else if (code < 0xd800 || code >= 0xe000) {
  212. blocks[i++] = 0xe0 | (code >> 12);
  213. blocks[i++] = 0x80 | ((code >> 6) & 0x3f);
  214. blocks[i++] = 0x80 | (code & 0x3f);
  215. } else {
  216. code = 0x10000 + (((code & 0x3ff) << 10) | (str.charCodeAt(++index) & 0x3ff));
  217. blocks[i++] = 0xf0 | (code >> 18);
  218. blocks[i++] = 0x80 | ((code >> 12) & 0x3f);
  219. blocks[i++] = 0x80 | ((code >> 6) & 0x3f);
  220. blocks[i++] = 0x80 | (code & 0x3f);
  221. }
  222. }
  223. bytes += i - start;
  224. start = i - 5;
  225. if (index === length) {
  226. ++index;
  227. }
  228. if (index > length && i < 6) {
  229. end = true;
  230. }
  231. v1 = blocks[0];
  232. if (i > 4) {
  233. v2 = blocks[1];
  234. v3 = blocks[2];
  235. v4 = blocks[3];
  236. v5 = blocks[4];
  237. base32Str += BASE32_ENCODE_CHAR[v1 >>> 3] +
  238. BASE32_ENCODE_CHAR[(v1 << 2 | v2 >>> 6) & 31] +
  239. BASE32_ENCODE_CHAR[(v2 >>> 1) & 31] +
  240. BASE32_ENCODE_CHAR[(v2 << 4 | v3 >>> 4) & 31] +
  241. BASE32_ENCODE_CHAR[(v3 << 1 | v4 >>> 7) & 31] +
  242. BASE32_ENCODE_CHAR[(v4 >>> 2) & 31] +
  243. BASE32_ENCODE_CHAR[(v4 << 3 | v5 >>> 5) & 31] +
  244. BASE32_ENCODE_CHAR[v5 & 31];
  245. } else if (i === 1) {
  246. base32Str += BASE32_ENCODE_CHAR[v1 >>> 3] +
  247. BASE32_ENCODE_CHAR[(v1 << 2) & 31] +
  248. '======';
  249. } else if (i === 2) {
  250. v2 = blocks[1];
  251. base32Str += BASE32_ENCODE_CHAR[v1 >>> 3] +
  252. BASE32_ENCODE_CHAR[(v1 << 2 | v2 >>> 6) & 31] +
  253. BASE32_ENCODE_CHAR[(v2 >>> 1) & 31] +
  254. BASE32_ENCODE_CHAR[(v2 << 4) & 31] +
  255. '====';
  256. } else if (i === 3) {
  257. v2 = blocks[1];
  258. v3 = blocks[2];
  259. base32Str += BASE32_ENCODE_CHAR[v1 >>> 3] +
  260. BASE32_ENCODE_CHAR[(v1 << 2 | v2 >>> 6) & 31] +
  261. BASE32_ENCODE_CHAR[(v2 >>> 1) & 31] +
  262. BASE32_ENCODE_CHAR[(v2 << 4 | v3 >>> 4) & 31] +
  263. BASE32_ENCODE_CHAR[(v3 << 1) & 31] +
  264. '===';
  265. } else {
  266. v2 = blocks[1];
  267. v3 = blocks[2];
  268. v4 = blocks[3];
  269. base32Str += BASE32_ENCODE_CHAR[v1 >>> 3] +
  270. BASE32_ENCODE_CHAR[(v1 << 2 | v2 >>> 6) & 31] +
  271. BASE32_ENCODE_CHAR[(v2 >>> 1) & 31] +
  272. BASE32_ENCODE_CHAR[(v2 << 4 | v3 >>> 4) & 31] +
  273. BASE32_ENCODE_CHAR[(v3 << 1 | v4 >>> 7) & 31] +
  274. BASE32_ENCODE_CHAR[(v4 >>> 2) & 31] +
  275. BASE32_ENCODE_CHAR[(v4 << 3) & 31] +
  276. '=';
  277. }
  278. } while (!end);
  279. return base32Str;
  280. };
  281. var encodeBytes = function (bytes) {
  282. var v1, v2, v3, v4, v5, base32Str = '', length = bytes.length;
  283. for (var i = 0, count = parseInt(length / 5) * 5; i < count;) {
  284. v1 = bytes[i++];
  285. v2 = bytes[i++];
  286. v3 = bytes[i++];
  287. v4 = bytes[i++];
  288. v5 = bytes[i++];
  289. base32Str += BASE32_ENCODE_CHAR[v1 >>> 3] +
  290. BASE32_ENCODE_CHAR[(v1 << 2 | v2 >>> 6) & 31] +
  291. BASE32_ENCODE_CHAR[(v2 >>> 1) & 31] +
  292. BASE32_ENCODE_CHAR[(v2 << 4 | v3 >>> 4) & 31] +
  293. BASE32_ENCODE_CHAR[(v3 << 1 | v4 >>> 7) & 31] +
  294. BASE32_ENCODE_CHAR[(v4 >>> 2) & 31] +
  295. BASE32_ENCODE_CHAR[(v4 << 3 | v5 >>> 5) & 31] +
  296. BASE32_ENCODE_CHAR[v5 & 31];
  297. }
  298. // remain char
  299. var remain = length - count;
  300. if (remain === 1) {
  301. v1 = bytes[i];
  302. base32Str += BASE32_ENCODE_CHAR[v1 >>> 3] +
  303. BASE32_ENCODE_CHAR[(v1 << 2) & 31] +
  304. '======';
  305. } else if (remain === 2) {
  306. v1 = bytes[i++];
  307. v2 = bytes[i];
  308. base32Str += BASE32_ENCODE_CHAR[v1 >>> 3] +
  309. BASE32_ENCODE_CHAR[(v1 << 2 | v2 >>> 6) & 31] +
  310. BASE32_ENCODE_CHAR[(v2 >>> 1) & 31] +
  311. BASE32_ENCODE_CHAR[(v2 << 4) & 31] +
  312. '====';
  313. } else if (remain === 3) {
  314. v1 = bytes[i++];
  315. v2 = bytes[i++];
  316. v3 = bytes[i];
  317. base32Str += BASE32_ENCODE_CHAR[v1 >>> 3] +
  318. BASE32_ENCODE_CHAR[(v1 << 2 | v2 >>> 6) & 31] +
  319. BASE32_ENCODE_CHAR[(v2 >>> 1) & 31] +
  320. BASE32_ENCODE_CHAR[(v2 << 4 | v3 >>> 4) & 31] +
  321. BASE32_ENCODE_CHAR[(v3 << 1) & 31] +
  322. '===';
  323. } else if (remain === 4) {
  324. v1 = bytes[i++];
  325. v2 = bytes[i++];
  326. v3 = bytes[i++];
  327. v4 = bytes[i];
  328. base32Str += BASE32_ENCODE_CHAR[v1 >>> 3] +
  329. BASE32_ENCODE_CHAR[(v1 << 2 | v2 >>> 6) & 31] +
  330. BASE32_ENCODE_CHAR[(v2 >>> 1) & 31] +
  331. BASE32_ENCODE_CHAR[(v2 << 4 | v3 >>> 4) & 31] +
  332. BASE32_ENCODE_CHAR[(v3 << 1 | v4 >>> 7) & 31] +
  333. BASE32_ENCODE_CHAR[(v4 >>> 2) & 31] +
  334. BASE32_ENCODE_CHAR[(v4 << 3) & 31] +
  335. '=';
  336. }
  337. return base32Str;
  338. };
  339. var encode = function (input, asciiOnly) {
  340. var notString = typeof(input) !== 'string';
  341. if (notString && input.constructor === ArrayBuffer) {
  342. input = new Uint8Array(input);
  343. }
  344. if (notString) {
  345. return encodeBytes(input);
  346. } else if (asciiOnly) {
  347. return encodeAscii(input);
  348. } else {
  349. return encodeUtf8(input);
  350. }
  351. };
  352. var decode = function (base32Str, asciiOnly) {
  353. if (!asciiOnly) {
  354. return toUtf8String(decodeAsBytes(base32Str));
  355. }
  356. if (!/^[A-Z2-7=]+$/.test(base32Str)) {
  357. throw new Error('Invalid base32 characters');
  358. }
  359. var v1, v2, v3, v4, v5, v6, v7, v8, str = '', length = base32Str.indexOf('=');
  360. if (length === -1) {
  361. length = base32Str.length;
  362. }
  363. // 8 char to 5 bytes
  364. for (var i = 0, count = length >> 3 << 3; i < count;) {
  365. v1 = BASE32_DECODE_CHAR[base32Str.charAt(i++)];
  366. v2 = BASE32_DECODE_CHAR[base32Str.charAt(i++)];
  367. v3 = BASE32_DECODE_CHAR[base32Str.charAt(i++)];
  368. v4 = BASE32_DECODE_CHAR[base32Str.charAt(i++)];
  369. v5 = BASE32_DECODE_CHAR[base32Str.charAt(i++)];
  370. v6 = BASE32_DECODE_CHAR[base32Str.charAt(i++)];
  371. v7 = BASE32_DECODE_CHAR[base32Str.charAt(i++)];
  372. v8 = BASE32_DECODE_CHAR[base32Str.charAt(i++)];
  373. str += String.fromCharCode((v1 << 3 | v2 >>> 2) & 255) +
  374. String.fromCharCode((v2 << 6 | v3 << 1 | v4 >>> 4) & 255) +
  375. String.fromCharCode((v4 << 4 | v5 >>> 1) & 255) +
  376. String.fromCharCode((v5 << 7 | v6 << 2 | v7 >>> 3) & 255) +
  377. String.fromCharCode((v7 << 5 | v8) & 255);
  378. }
  379. // remain bytes
  380. var remain = length - count;
  381. if (remain === 2) {
  382. v1 = BASE32_DECODE_CHAR[base32Str.charAt(i++)];
  383. v2 = BASE32_DECODE_CHAR[base32Str.charAt(i++)];
  384. str += String.fromCharCode((v1 << 3 | v2 >>> 2) & 255);
  385. } else if (remain === 4) {
  386. v1 = BASE32_DECODE_CHAR[base32Str.charAt(i++)];
  387. v2 = BASE32_DECODE_CHAR[base32Str.charAt(i++)];
  388. v3 = BASE32_DECODE_CHAR[base32Str.charAt(i++)];
  389. v4 = BASE32_DECODE_CHAR[base32Str.charAt(i++)];
  390. str += String.fromCharCode((v1 << 3 | v2 >>> 2) & 255) +
  391. String.fromCharCode((v2 << 6 | v3 << 1 | v4 >>> 4) & 255);
  392. } else if (remain === 5) {
  393. v1 = BASE32_DECODE_CHAR[base32Str.charAt(i++)];
  394. v2 = BASE32_DECODE_CHAR[base32Str.charAt(i++)];
  395. v3 = BASE32_DECODE_CHAR[base32Str.charAt(i++)];
  396. v4 = BASE32_DECODE_CHAR[base32Str.charAt(i++)];
  397. v5 = BASE32_DECODE_CHAR[base32Str.charAt(i++)];
  398. str += String.fromCharCode((v1 << 3 | v2 >>> 2) & 255) +
  399. String.fromCharCode((v2 << 6 | v3 << 1 | v4 >>> 4) & 255) +
  400. String.fromCharCode((v4 << 4 | v5 >>> 1) & 255);
  401. } else if (remain === 7) {
  402. v1 = BASE32_DECODE_CHAR[base32Str.charAt(i++)];
  403. v2 = BASE32_DECODE_CHAR[base32Str.charAt(i++)];
  404. v3 = BASE32_DECODE_CHAR[base32Str.charAt(i++)];
  405. v4 = BASE32_DECODE_CHAR[base32Str.charAt(i++)];
  406. v5 = BASE32_DECODE_CHAR[base32Str.charAt(i++)];
  407. v6 = BASE32_DECODE_CHAR[base32Str.charAt(i++)];
  408. v7 = BASE32_DECODE_CHAR[base32Str.charAt(i++)];
  409. str += String.fromCharCode((v1 << 3 | v2 >>> 2) & 255) +
  410. String.fromCharCode((v2 << 6 | v3 << 1 | v4 >>> 4) & 255) +
  411. String.fromCharCode((v4 << 4 | v5 >>> 1) & 255) +
  412. String.fromCharCode((v5 << 7 | v6 << 2 | v7 >>> 3) & 255);
  413. }
  414. return str;
  415. };
  416. var exports = {
  417. encode: encode,
  418. decode: decode
  419. };
  420. decode.asBytes = decodeAsBytes;
  421. if (COMMON_JS) {
  422. module.exports = exports;
  423. } else {
  424. root.base32 = exports;
  425. if (AMD) {
  426. define(function() {
  427. return exports;
  428. });
  429. }
  430. }
  431. })();