4 месяца назад
История
README.md
lua-base64
Модуль для Lua
. Кодирование и декодирование base64
по умолчанию используется вариант RFC4648
, но имеется
возможность задать любой иной вариант алфавита кодирования
В репозитории два каталога 5_1
и 5_3
, название каталога
указывает на минимальную версию Lua
для варианта модуля.
5_1/base64.lua
содержит модуль дляLuaJit
Lua5.1
Lua5.2
5_3/base64.lua
содержит модуль дляLua5.3
Lua5.4
Зависимости
sudo apt install lua
Если предполагается использовать Lua5.1
то
sudo apt install lua lua-bit32
Установка и удаление
Глобально
sudo make install
sudo make uninstall
Локально
make PREFIX=$HOME/.local install
make PREFIX=$HOME/.local uninstall
Независимо
make DESTDIR=$HOME/some_you_dir install
make DESTDIR=$HOME/some_you_dir uninstall
Использование
Минимальный пример
local base64 = require("base64")
local base = base64.encode("Hello World!")
local text = base64.decode("SGVsbG8gV29ybGQh")
print(base,text)
Пример использования альтернативного кодирования
local base64 = require("base64")
local basename = 'mybase64'
local alphabet = 'ABCDEFGcdefghijHIJKLMN0123456789*?abkOPQRSTUVWXYZlmnopqrstuvwxyz'
local endcode = '@'
assert(base64.register(basename,alphabet,endcode))
local base = base64.encode("Hello World!","mybase64")
local text = base64.decode("KGNV5Gw*Nqxm5GI?","mybase64")
print(base,text)
Различные варианты Base64
существующие в реальности.
Этот список не претендует на полноту, есть полные совпадения с rfc4648
.
----------
basename = 'rfc4648'
endcode = '='
alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
----------
baename = 'rfc1421'
endcode = '='
alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
----------
baename = 'rfc2045'
endcode = '='
alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
----------
basename = 'freenet'
endcode = '='
alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789~-';
----------
basename = 'rfc3548'
endcode = '='
alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
----------
basename = 'rfc4880'
endcode = '='
alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
----------
basename = 'y64'
endcode = '-'
alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789._';
----------
basename = 'rfc1642'
endcode = '\0'
alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
----------
basename = 'xmltoken'
endcode = '\0'
alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.-';
----------
basename = 'xmlname'
endcode = '\0'
alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_:';
----------
basename = 'pident1'
endcode = '\0'
alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_-';
----------
basename = 'pident2'
endcode = '\0'
alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789._';
----------
basename = 'rfc3501'
endcode = '\0'
alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+,';
Описание API
-------------------------------------------------------
-- required string : basename - your custom basename
-- required string : alphabet - 64 unique ASCII symbols
-- required string : encode - single unique symbol
-------------------------------------------------------
-- return boolean : true,nil or false,error_string
-------------------------------------------------------
base64.register(basename,alphabet,endcode)
----------------------------------------------------------
-- required string : input_data : string with any bytedata
-- optional string : basename : base64 variant name (default rfc4648)
----------------------------------------------------------
-- return string : encoded_string or nil,error_string
----------------------------------------------------------
base64.encode(input_data,basename)
-----------------------------------------------------------
-- required string : input_data : base64 encoded data
-- optional string : basename : base64 variant name (default rfc4648)
-----------------------------------------------------------
-- return string : decoced_data or nil,error_string
-----------------------------------------------------------
base64.decode(input_data,basename)
На заметку
Кажется всё работает правильно. Локальный тест.
local base64
if tonumber(_VERSION:match('Lua 5.(%d+)')) <= 2 then
base64 = require('5_1.base64')
else
base64 = require('5_3.base64')
end
assert(base64.encode("") == "")
assert(base64.encode("f") == "Zg==",base64.encode("f"))
assert(base64.encode("fo") == "Zm8=",base64.encode("fo"))
assert(base64.encode("foo") == "Zm9v",base64.encode("foo"))
assert(base64.encode("foob") == "Zm9vYg==",base64.encode("foob"))
assert(base64.encode("fooba") == "Zm9vYmE=")
assert(base64.encode("foobar") == "Zm9vYmFy")
assert(base64.decode("") == "")
assert(base64.decode("Zg==") == "f",base64.decode("Zg=="))
assert(base64.decode("Zm8=") == "fo",base64.decode("Zm8="))
assert(base64.decode("Zm9v") == "foo",base64.decode("Zm9v"))
assert(base64.decode("Zm9vYg==") == "foob",base64.decode("Zm9vYg=="))
assert(base64.decode("Zm9vYmE=") == "fooba",base64.decode("Zm9vYmE="))
assert(base64.decode("Zm9vYmFy") == "foobar",base64.decode("Zm9vYmFy"))
local alphabet = "abc-efghijklm*opqrstuvwxyz%123456789A+CDEFGHIJKLMNOPQRSTUVWXYZ!@"
assert(base64.register('testname',alphabet,'?'))
local raw = "foob"
local cod = base64.encode(raw,'testname')
local out = base64.decode(cod,'testname')
assert(raw == out)
Спасибо @PPP328 за уточнение по поводу наличия вариантов Base64