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

Описание

Кодирование и декодирование Base64 на Lua

Конвейеры
0 успешных
0 с ошибкой