rev |
line source |
jbe/bsw@0
|
1 local alphabet = {
|
jbe/bsw@0
|
2 "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M",
|
jbe/bsw@0
|
3 "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z",
|
jbe/bsw@0
|
4 "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m",
|
jbe/bsw@0
|
5 "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z",
|
jbe/bsw@0
|
6 "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "+", "/"
|
jbe/bsw@0
|
7 }
|
jbe/bsw@0
|
8
|
jbe/bsw@0
|
9 function encode.mime.base64(str)
|
jbe/bsw@0
|
10 local parts = {}
|
jbe/bsw@0
|
11 local pos = 1
|
jbe/bsw@0
|
12 local block_count = 0
|
jbe/bsw@0
|
13 while pos <= #str do
|
jbe/bsw@0
|
14 local s = string.sub(str, pos, pos + 2)
|
jbe/bsw@0
|
15 local n = 0
|
jbe/bsw@0
|
16 for i = 1, 3 do
|
jbe/bsw@0
|
17 n = n * 256
|
jbe/bsw@0
|
18 if i <= #s then
|
jbe/bsw@0
|
19 n = n + string.byte(string.sub(s, i, i))
|
jbe/bsw@0
|
20 end
|
jbe/bsw@0
|
21 end
|
jbe/bsw@0
|
22 parts[#parts+1] = alphabet[math.floor(n / 262144) + 1]
|
jbe/bsw@0
|
23 parts[#parts+1] = alphabet[math.floor(n / 4096) % 64 + 1]
|
jbe/bsw@0
|
24 if #s > 1 then
|
jbe/bsw@0
|
25 parts[#parts+1] = alphabet[math.floor(n / 64) % 64 + 1]
|
jbe/bsw@0
|
26 else
|
jbe/bsw@0
|
27 parts[#parts+1] = "="
|
jbe/bsw@0
|
28 end
|
jbe/bsw@0
|
29 if #s > 2 then
|
jbe/bsw@0
|
30 parts[#parts+1] = alphabet[n % 64 + 1]
|
jbe/bsw@0
|
31 else
|
jbe/bsw@0
|
32 parts[#parts+1] = "="
|
jbe/bsw@0
|
33 end
|
jbe/bsw@0
|
34 block_count = block_count + 1
|
jbe/bsw@0
|
35 if block_count == 19 then
|
jbe/bsw@0
|
36 parts[#parts+1] = "\r\n"
|
jbe/bsw@0
|
37 block_count = 0
|
jbe/bsw@0
|
38 end
|
jbe/bsw@0
|
39 pos = pos + #s
|
jbe/bsw@0
|
40 end
|
jbe/bsw@0
|
41 if block_count > 0 then
|
jbe/bsw@0
|
42 parts[#parts+1] = "\r\n"
|
jbe/bsw@0
|
43 end
|
jbe/bsw@0
|
44 return table.concat(parts)
|
jbe/bsw@0
|
45 end
|