codec-base64.js 1.1 KB

1234567891011121314151617181920212223242526272829303132333435
  1. const ALPHABET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='
  2. function toUtf8Bytes(text) {
  3. let out = ''
  4. const normalized = String(text).replace(/\r\n/g, '\n')
  5. for (let i = 0; i < normalized.length; i++) {
  6. const code = normalized.charCodeAt(i)
  7. if (code < 128) {
  8. out += String.fromCharCode(code)
  9. } else if (code < 2048) {
  10. out += String.fromCharCode((code >> 6) | 192, (code & 63) | 128)
  11. } else {
  12. out += String.fromCharCode((code >> 12) | 224, ((code >> 6) & 63) | 128, (code & 63) | 128)
  13. }
  14. }
  15. return out
  16. }
  17. export default class Base64Codec {
  18. encode(plain) {
  19. const bytes = toUtf8Bytes(plain)
  20. let output = ''
  21. for (let i = 0; i < bytes.length;) {
  22. const c1 = bytes.charCodeAt(i++)
  23. const c2 = bytes.charCodeAt(i++)
  24. const c3 = bytes.charCodeAt(i++)
  25. const b1 = c1 >> 2
  26. const b2 = ((c1 & 3) << 4) | (isNaN(c2) ? 0 : c2 >> 4)
  27. const b3 = isNaN(c2) ? 64 : (((c2 & 15) << 2) | (isNaN(c3) ? 0 : c3 >> 6))
  28. const b4 = isNaN(c3) ? 64 : (c3 & 63)
  29. output += ALPHABET[b1] + ALPHABET[b2] + ALPHABET[b3] + ALPHABET[b4]
  30. }
  31. return output
  32. }
  33. }