Create base64.lua
This commit is contained in:
parent
05157887fc
commit
0fce7366ac
1 changed files with 88 additions and 0 deletions
88
src/apis/base64.lua
Normal file
88
src/apis/base64.lua
Normal file
|
@ -0,0 +1,88 @@
|
|||
-- base64 API by MultMine
|
||||
local base64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
|
||||
.. "abcdefghijklmnopqrstuvwxyz0123456789+/"
|
||||
|
||||
local function toBits(n)
|
||||
local t = {}
|
||||
for i = 8, 1, -1 do
|
||||
table.insert(t, bit.brshift(bit.band(n, 2^(i-1)), i - 1))
|
||||
end
|
||||
return t
|
||||
end
|
||||
|
||||
local function encodeBlock(blk)
|
||||
local b64 = ""
|
||||
local b64_bits = {}
|
||||
for i = 1, 3 do
|
||||
local c = string.byte(blk:sub(i, i)) or 0
|
||||
for j = 8, 1, -1 do
|
||||
table.insert(b64_bits, bit.brshift(bit.band(c, 2^(j-1)), j - 1))
|
||||
end
|
||||
end
|
||||
local byteCount = #blk + 1
|
||||
for i = 1, byteCount do
|
||||
local n = 0
|
||||
for j = 1, 6 do
|
||||
n = n + (2 ^ (6 - j)) * b64_bits[(i - 1) * 6 + j]
|
||||
end
|
||||
b64 = b64 .. base64:sub(n + 1, n + 1)
|
||||
end
|
||||
return b64 .. string.rep("=", 4 - byteCount)
|
||||
end
|
||||
|
||||
local function decodeBlock(b64)
|
||||
local msg = ""
|
||||
local msg_bits = {}
|
||||
for i = 1, 4 do
|
||||
local c = b64:sub(i, i):byte()
|
||||
if c >= 0x30 and c <= 0x39 then
|
||||
local t = toBits(c + 4)
|
||||
for j = 3, 8 do
|
||||
table.insert(msg_bits, t[j])
|
||||
end
|
||||
elseif c == string.byte("+") then
|
||||
for j = 1, 5 do
|
||||
table.insert(msg_bits, 1)
|
||||
end
|
||||
table.insert(msg_bits, 0)
|
||||
elseif c == string.byte("/") then
|
||||
for j = 1, 6 do
|
||||
table.insert(msg_bits, 1)
|
||||
end
|
||||
elseif c >= 65 and c <= string.byte("Z") then
|
||||
local t = toBits(c - 65)
|
||||
for j = 3, 8 do
|
||||
table.insert(msg_bits, t[j])
|
||||
end
|
||||
elseif c >= 97 and c <= string.byte("z") then
|
||||
local t = toBits(c - 71)
|
||||
for j = 3, 8 do
|
||||
table.insert(msg_bits, t[j])
|
||||
end
|
||||
end
|
||||
end
|
||||
for i = 1, #msg_bits / 8 do
|
||||
local n = 0
|
||||
for j = 1, 8 do
|
||||
n = n + (2 ^ (8 - j)) * msg_bits[(i - 1) * 8 + j]
|
||||
end
|
||||
msg = msg .. string.char(n)
|
||||
end
|
||||
return msg
|
||||
end
|
||||
|
||||
function encode(msg)
|
||||
local b64 = ""
|
||||
for i = 1, math.ceil(#msg / 3) do
|
||||
b64 = b64 .. encodeBlock(msg:sub((i - 1) * 3 + 1, i * 3))
|
||||
end
|
||||
return b64
|
||||
end
|
||||
|
||||
function decode(b64)
|
||||
local msg = ""
|
||||
for i = 1, #b64 / 4 do
|
||||
msg = msg .. decodeBlock(b64:sub((i - 1) * 4 + 1, i * 4))
|
||||
end
|
||||
return msg
|
||||
end
|
Loading…
Reference in a new issue