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 с ошибкой