base64_v2.lua 829 B

123456789101112131415161718192021222324252627282930313233343536
  1. --this version actually works
  2. local tab = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
  3. base64 = {
  4. enc = function(data)
  5. local l,out = 0,''
  6. local m = (3-data:len()%3)%3
  7. local d = data..string.rep('\0',m)
  8. for i=1,d:len() do
  9. l = bit.lshift(l,8)
  10. l = l+d:byte(i,i)
  11. if i%3==0 then
  12. for j=1,4 do
  13. local a = bit.rshift(l,18)+1
  14. out = out..tab:sub(a,a)
  15. l = bit.band(bit.lshift(l,6),0xFFFFFF)
  16. end
  17. end
  18. end
  19. return out:sub(1,-1-m)..string.rep('=',m)
  20. end,
  21. dec = function(data)
  22. local a,b = data:gsub('=','A')
  23. local out = ''
  24. local l = 0
  25. for i=1,a:len() do
  26. l=l+tab:find(a:sub(i,i))-1
  27. if i%4==0 then
  28. out=out..string.char(bit.rshift(l,16),bit.band(bit.rshift(l,8),255),bit.band(l,255))
  29. l=0
  30. end
  31. l=bit.lshift(l,6)
  32. end
  33. return out:sub(1,-b-1)
  34. end
  35. }