diff --git a/ActionBarSaverReloaded.toc b/ActionBarSaverReloaded.toc index 7ceb424..ee84eae 100644 --- a/ActionBarSaverReloaded.toc +++ b/ActionBarSaverReloaded.toc @@ -5,6 +5,7 @@ ## Author: Voodoomoose ## SavedVariables: ActionBarSaverReloaded +B64.lua Constants.lua Main.lua Actions.lua \ No newline at end of file diff --git a/B64.lua b/B64.lua new file mode 100644 index 0000000..f826776 --- /dev/null +++ b/B64.lua @@ -0,0 +1,39 @@ +if not B64 then B64 = {} end +local encode, decode = {}, { [strbyte("=")] = false } +for value = 0, 63 do + local char = strsub('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/', value+1, value+1) + encode[value] = char + decode[strbyte(char)] = value +end + +local t = {} +function B64.Encode(str) + local j = 1 + for i = 1, strlen(str), 3 do + local a, b, c = strbyte(str, i, i+2) + t[j] = encode[bit.rshift(a, 2)] + t[j+1] = encode[bit.band(bit.lshift(a, 4) + bit.rshift(b or 0, 4), 0x3F)] + t[j+2] = b and encode[bit.band(bit.lshift(b, 2) + bit.rshift(c or 0, 6), 0x3F)] or "=" + t[j+3] = c and encode[bit.band(c, 0x3F)] or "=" + j = j + 4 + end + return table.concat(t, "", 1, j-1) +end + +function B64Decode(str) + local j = 1 + assert(strlen(str) % 4 == 0, format("invalid data length: %d", strlen(str))) + for i = 1, strlen(str), 4 do + local ba, bb, bc, bd = strbyte(str, i, i+3) + local a, b, c, d = decode[ba], decode[bb], decode[bc], decode[bd] + assert(a ~= nil, format("invalid data at position %d: '%s'", i, ba)) + assert(b ~= nil, format("invalid data at position %d: '%s'", i+1, bb)) + assert(c ~= nil, format("invalid data at position %d: '%s'", i+2, bc)) + assert(d ~= nil, format("invalid data at position %d: '%s'", i+3, bd)) + t[j] = strchar(bit.lshift(a, 2) + bit.rshift(b, 4)) + t[j+1] = c and strchar(bit.band(bit.lshift(b, 4) + bit.rshift(c, 2), 0xFF)) or "" + t[j+2] = d and strchar(bit.band(bit.lshift(c, 6) + d, 0xFF)) or "" + j = j + 3 + end + return table.concat(t, "", 1, j-1) +end