summaryrefslogtreecommitdiff
path: root/base64.lua
blob: 4f9a9672e52c50c97e9af5c21b0a701ce41778c6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
local alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"

-- really bad
local function encode(s)
	local x = 0
	local n = 0
	local out = {}
	local outn = 1
	local pad = ""
	local function si(v, m) x = (x << m) | v; n = n + m end
	local function so(m)
		local rem = n - m
		local res = x >> rem
		x = x & ((1 << rem) - 1)
		n = n - m
		return res
	end
	local function o()
		while n >= 6 do
			local i = so(6)+1
			out[outn] = alphabet:sub(i,i)
			outn = outn + 1
		end
	end
	for i = 1, #s do
		si(s:byte(i), 8)
		o()
	end
	if n > 0 then
		local on = n
		si(0, 6-n)
		o()
		pad = ('='):rep(3-on/2) -- bad
	end
	return table.concat(out)..pad
end

return {encode=encode}