| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152 |
- local M = {}
- -- Base64 字符集
- local b64chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
- -- 创建 Base64 反向查找表
- local b64lookup = {}
- for i = 1, #b64chars do
- b64lookup[string.sub(b64chars, i, i)] = i - 1
- end
- M.encode = function(input)
- local output = {}
- local len = #input
- for i = 1, len, 3 do
- local a, b, c = string.byte(input, i, i + 2)
- local chunk = (a or 0) << 16 | (b or 0) << 8 | (c or 0)
- output[#output + 1] = b64chars:sub(((chunk >> 18) & 0x3F) + 1, ((chunk >> 18) & 0x3F) + 1)
- output[#output + 1] = b64chars:sub(((chunk >> 12) & 0x3F) + 1, ((chunk >> 12) & 0x3F) + 1)
- output[#output + 1] = b and b64chars:sub(((chunk >> 6) & 0x3F) + 1, ((chunk >> 6) & 0x3F) + 1) or "="
- output[#output + 1] = c and b64chars:sub((chunk & 0x3F) + 1, (chunk & 0x3F) + 1) or "="
- end
- return table.concat(output)
- end
- -- Base64 解码函数
- M.decode = function(input)
- input = input:gsub("%s", ""):gsub("=", "") -- 去除空白和填充符
- local output = {}
- for i = 1, #input, 4 do
- local a, b, c, d = b64lookup[input:sub(i, i)], b64lookup[input:sub(i + 1, i + 1)],
- b64lookup[input:sub(i + 2, i + 2)] or 0, b64lookup[input:sub(i + 3, i + 3)] or 0
- local chunk = (a << 18) | (b << 12) | (c << 6) | d
- output[#output + 1] = string.char((chunk >> 16) & 0xFF)
- if input:sub(i + 2, i + 2) ~= "" then
- output[#output + 1] = string.char((chunk >> 8) & 0xFF)
- end
- if input:sub(i + 3, i + 3) ~= "" then
- output[#output + 1] = string.char(chunk & 0xFF)
- end
- end
- return table.concat(output)
- end
- return M
|