jbe/bsw@0: local alphabet = { jbe/bsw@0: "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", jbe/bsw@0: "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", jbe/bsw@0: "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", jbe/bsw@0: "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", jbe/bsw@0: "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "+", "/" jbe/bsw@0: } jbe/bsw@0: jbe/bsw@0: function encode.mime.base64(str) jbe/bsw@0: local parts = {} jbe/bsw@0: local pos = 1 jbe/bsw@0: local block_count = 0 jbe/bsw@0: while pos <= #str do jbe/bsw@0: local s = string.sub(str, pos, pos + 2) jbe/bsw@0: local n = 0 jbe/bsw@0: for i = 1, 3 do jbe/bsw@0: n = n * 256 jbe/bsw@0: if i <= #s then jbe/bsw@0: n = n + string.byte(string.sub(s, i, i)) jbe/bsw@0: end jbe/bsw@0: end jbe/bsw@0: parts[#parts+1] = alphabet[math.floor(n / 262144) + 1] jbe/bsw@0: parts[#parts+1] = alphabet[math.floor(n / 4096) % 64 + 1] jbe/bsw@0: if #s > 1 then jbe/bsw@0: parts[#parts+1] = alphabet[math.floor(n / 64) % 64 + 1] jbe/bsw@0: else jbe/bsw@0: parts[#parts+1] = "=" jbe/bsw@0: end jbe/bsw@0: if #s > 2 then jbe/bsw@0: parts[#parts+1] = alphabet[n % 64 + 1] jbe/bsw@0: else jbe/bsw@0: parts[#parts+1] = "=" jbe/bsw@0: end jbe/bsw@0: block_count = block_count + 1 jbe/bsw@0: if block_count == 19 then jbe/bsw@0: parts[#parts+1] = "\r\n" jbe/bsw@0: block_count = 0 jbe/bsw@0: end jbe/bsw@0: pos = pos + #s jbe/bsw@0: end jbe/bsw@0: if block_count > 0 then jbe/bsw@0: parts[#parts+1] = "\r\n" jbe/bsw@0: end jbe/bsw@0: return table.concat(parts) jbe/bsw@0: end