base64Binary.js 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. /**
  2. *
  3. * 借鉴自:https://github.com/dankogai/js-base64/blob/main/base64.js
  4. * 因uniapp没有引用window,也无法使用Buffer,因此直接使用polyfill
  5. *
  6. */
  7. const b64ch = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
  8. const b64chs = [...b64ch];
  9. const b64re = /^(?:[A-Za-z\d+\/]{4})*?(?:[A-Za-z\d+\/]{2}(?:==)?|[A-Za-z\d+\/]{3}=?)?$/;
  10. const b64tab = ((a) => {
  11. let tab = {};
  12. a.forEach((c, i) => tab[c] = i);
  13. return tab;
  14. })(b64chs);
  15. const _fromCC = String.fromCharCode.bind(String);
  16. /**
  17. * polyfill version of `btoa`
  18. */
  19. const btoaPolyfill = (bin) => {
  20. // console.log('polyfilled');
  21. let u32, c0, c1, c2, asc = ''
  22. const pad = bin.length % 3
  23. for (let i = 0;i < bin.length;) {
  24. if ((c0 = bin.charCodeAt(i++)) > 255 ||
  25. (c1 = bin.charCodeAt(i++)) > 255 ||
  26. (c2 = bin.charCodeAt(i++)) > 255)
  27. throw new TypeError('invalid character found')
  28. u32 = (c0 << 16) | (c1 << 8) | c2
  29. asc += b64chs[u32 >> 18 & 63]
  30. + b64chs[u32 >> 12 & 63]
  31. + b64chs[u32 >> 6 & 63]
  32. + b64chs[u32 & 63]
  33. }
  34. return pad ? asc.slice(0, pad - 3) + "===".substring(pad) : asc
  35. }
  36. /**
  37. * polyfill version of `atob`
  38. */
  39. const atobPolyfill = (asc) => {
  40. // console.log('polyfilled');
  41. asc = asc.replace(/\s+/g, '')
  42. if (!b64re.test(asc))
  43. throw new TypeError('malformed base64.')
  44. asc += '=='.slice(2 - (asc.length & 3))
  45. let u24, bin = '', r1, r2
  46. for (let i = 0;i < asc.length;) {
  47. u24 = b64tab[asc.charAt(i++)] << 18
  48. | b64tab[asc.charAt(i++)] << 12
  49. | (r1 = b64tab[asc.charAt(i++)]) << 6
  50. | (r2 = b64tab[asc.charAt(i++)])
  51. bin += r1 === 64 ? _fromCC(u24 >> 16 & 255)
  52. : r2 === 64 ? _fromCC(u24 >> 16 & 255, u24 >> 8 & 255)
  53. : _fromCC(u24 >> 16 & 255, u24 >> 8 & 255, u24 & 255)
  54. }
  55. return bin
  56. }
  57. //base64转ArrayBuffer
  58. function base64ToArrayBuffer (base64) {
  59. const binaryStr = atobPolyfill(base64)
  60. const byteLength = binaryStr.length
  61. const bytes = new Uint8Array(byteLength)
  62. for (let i = 0;i < byteLength;i++) {
  63. bytes[i] = binary.charCodeAt(i)
  64. }
  65. return bytes.buffer
  66. }
  67. //ArrayBuffer转base64
  68. function arrayBufferToBase64 (buffer) {
  69. let binaryStr = ""
  70. const bytes = new Uint8Array(buffer)
  71. var len = bytes.byteLength;
  72. for (let i = 0; i < len; i++) {
  73. binaryStr += String.fromCharCode(bytes[i])
  74. }
  75. return btoaPolyfill(binaryStr)
  76. }
  77. module.exports = {
  78. base64ToArrayBuffer,
  79. arrayBufferToBase64,
  80. };