base65.js 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285
  1. /*
  2. 编码规则
  3. Base64编码的思想是是采用64个基本的ASCII码字符对数据进行重新编码。
  4. 它将需要编码的数据拆分成字节数组。
  5. 以3个字节为一组。按顺序排列24 位数据,再把这24位数据分成4组,即每组6位。
  6. 再在每组的的最高位前补两个0凑足一个字节。
  7. 这样就把一个3字节为一组的数据重新编码成了4个字节。
  8. 当所要编码的数据的字节数不是3的整倍数,
  9. 也就是说在分组时最后一组不够3个字节。
  10. 这时在最后一组填充1到2个0字节。
  11. 并在最后编码完成后在结尾添加1到2个 “=”。
  12. 加密解密base64字符串
  13. Add by mazhuang 2016026
  14. */
  15. var Base65 = {
  16. // 下面是64个基本的编码
  17. base64EncodeChars: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=',
  18. base64DecodeChars: [
  19. -1,
  20. -1,
  21. -1,
  22. -1,
  23. -1,
  24. -1,
  25. -1,
  26. -1,
  27. -1,
  28. -1,
  29. -1,
  30. -1,
  31. -1,
  32. -1,
  33. -1,
  34. -1,
  35. -1,
  36. -1,
  37. -1,
  38. -1,
  39. -1,
  40. -1,
  41. -1,
  42. -1,
  43. -1,
  44. -1,
  45. -1,
  46. -1,
  47. -1,
  48. -1,
  49. -1,
  50. -1,
  51. -1,
  52. -1,
  53. -1,
  54. -1,
  55. -1,
  56. -1,
  57. -1,
  58. -1,
  59. -1,
  60. -1,
  61. -1,
  62. 62,
  63. -1,
  64. -1,
  65. -1,
  66. 63,
  67. 52,
  68. 53,
  69. 54,
  70. 55,
  71. 56,
  72. 57,
  73. 58,
  74. 59,
  75. 60,
  76. 61,
  77. -1,
  78. -1,
  79. -1,
  80. -1,
  81. -1,
  82. -1,
  83. -1,
  84. 0,
  85. 1,
  86. 2,
  87. 3,
  88. 4,
  89. 5,
  90. 6,
  91. 7,
  92. 8,
  93. 9,
  94. 10,
  95. 11,
  96. 12,
  97. 13,
  98. 14,
  99. 15,
  100. 16,
  101. 17,
  102. 18,
  103. 19,
  104. 20,
  105. 21,
  106. 22,
  107. 23,
  108. 24,
  109. 25,
  110. -1,
  111. -1,
  112. -1,
  113. -1,
  114. -1,
  115. -1,
  116. 26,
  117. 27,
  118. 28,
  119. 29,
  120. 30,
  121. 31,
  122. 32,
  123. 33,
  124. 34,
  125. 35,
  126. 36,
  127. 37,
  128. 38,
  129. 39,
  130. 40,
  131. 41,
  132. 42,
  133. 43,
  134. 44,
  135. 45,
  136. 46,
  137. 47,
  138. 48,
  139. 49,
  140. 50,
  141. 51,
  142. -1,
  143. -1,
  144. -1,
  145. -1,
  146. -1,
  147. ],
  148. // 编码的方法
  149. base64encode: function(str) {
  150. var out, i, len
  151. var c1, c2, c3
  152. len = str.length
  153. i = 0
  154. out = ''
  155. while (i < len) {
  156. c1 = str.charCodeAt(i++) & 0xff
  157. if (i === len) {
  158. out += Base65.base64EncodeChars.charAt(c1 >> 2)
  159. out += Base65.base64EncodeChars.charAt((c1 & 0x3) << 4)
  160. out += '=='
  161. break
  162. }
  163. c2 = str.charCodeAt(i++)
  164. if (i === len) {
  165. out += Base65.base64EncodeChars.charAt(c1 >> 2)
  166. out += Base65.base64EncodeChars.charAt(((c1 & 0x3) << 4) | ((c2 & 0xf0) >> 4))
  167. out += Base65.base64EncodeChars.charAt((c2 & 0xf) << 2)
  168. out += '='
  169. break
  170. }
  171. c3 = str.charCodeAt(i++)
  172. out += Base65.base64EncodeChars.charAt(c1 >> 2)
  173. out += Base65.base64EncodeChars.charAt(((c1 & 0x3) << 4) | ((c2 & 0xf0) >> 4))
  174. out += Base65.base64EncodeChars.charAt(((c2 & 0xf) << 2) | ((c3 & 0xc0) >> 6))
  175. out += Base65.base64EncodeChars.charAt(c3 & 0x3f)
  176. }
  177. return out
  178. },
  179. // 解码的方法
  180. base64decode: function(str) {
  181. var c1, c2, c3, c4
  182. var i, len, out
  183. len = str.length
  184. i = 0
  185. out = ''
  186. while (i < len) {
  187. do {
  188. c1 = Base65.base64DecodeChars[str.charCodeAt(i++) & 0xff]
  189. } while (i < len && c1 === -1)
  190. if (c1 === -1) break
  191. do {
  192. c2 = Base65.base64DecodeChars[str.charCodeAt(i++) & 0xff]
  193. } while (i < len && c2 === -1)
  194. if (c2 === -1) break
  195. out += String.fromCharCode((c1 << 2) | ((c2 & 0x30) >> 4))
  196. do {
  197. c3 = str.charCodeAt(i++) & 0xff
  198. if (c3 === 61) return out
  199. c3 = Base65.base64DecodeChars[c3]
  200. } while (i < len && c3 === -1)
  201. if (c3 === -1) break
  202. out += String.fromCharCode(((c2 & 0xf) << 4) | ((c3 & 0x3c) >> 2))
  203. do {
  204. c4 = str.charCodeAt(i++) & 0xff
  205. if (c4 === 61) return out
  206. c4 = Base65.base64DecodeChars[c4]
  207. } while (i < len && c4 === -1)
  208. if (c4 === -1) break
  209. out += String.fromCharCode(((c3 & 0x03) << 6) | c4)
  210. }
  211. return out
  212. },
  213. utf16to8: function(str) {
  214. var out, i, len, c
  215. out = ''
  216. len = str.length
  217. for (i = 0; i < len; i++) {
  218. c = str.charCodeAt(i)
  219. if (c >= 0x0001 && c <= 0x007f) {
  220. out += str.charAt(i)
  221. } else if (c > 0x07ff) {
  222. out += String.fromCharCode(0xe0 | ((c >> 12) & 0x0f))
  223. out += String.fromCharCode(0x80 | ((c >> 6) & 0x3f))
  224. out += String.fromCharCode(0x80 | ((c >> 0) & 0x3f))
  225. } else {
  226. out += String.fromCharCode(0xc0 | ((c >> 6) & 0x1f))
  227. out += String.fromCharCode(0x80 | ((c >> 0) & 0x3f))
  228. }
  229. }
  230. return out
  231. },
  232. utf8to16: function(str) {
  233. var out, i, len, c
  234. var char2, char3
  235. out = ''
  236. len = str.length
  237. i = 0
  238. while (i < len) {
  239. c = str.charCodeAt(i++)
  240. switch (c >> 4) {
  241. case 0:
  242. case 1:
  243. case 2:
  244. case 3:
  245. case 4:
  246. case 5:
  247. case 6:
  248. case 7:
  249. // 0xxxxxxx
  250. out += str.charAt(i - 1)
  251. break
  252. case 12:
  253. case 13:
  254. // 110x xxxx 10xx xxxx
  255. char2 = str.charCodeAt(i++)
  256. out += String.fromCharCode(((c & 0x1f) << 6) | (char2 & 0x3f))
  257. break
  258. case 14:
  259. // 1110 xxxx 10xx xxxx 10xx xxxx
  260. char2 = str.charCodeAt(i++)
  261. char3 = str.charCodeAt(i++)
  262. out += String.fromCharCode(
  263. ((c & 0x0f) << 12) | ((char2 & 0x3f) << 6) | ((char3 & 0x3f) << 0)
  264. )
  265. break
  266. }
  267. }
  268. return out
  269. }, // end
  270. encode: function(input) {
  271. return Base65.base64encode(Base65.utf16to8(input))
  272. },
  273. decode: function(str) {
  274. return Base65.utf8to16(Base65.base64decode(str))
  275. },
  276. isBase64: function(str) {
  277. return !str.match(/./g).some((x) => this.base64EncodeChars.indexOf(x) === -1)
  278. },
  279. }
  280. export { Base65 }