Перейти к содержанию
Материалы раздела

Base64: модуль utils

Модуль utils нужен, когда программа на uLua обменивается двоичными данными через текстовый протокол. Он кодирует и декодирует Base64 без динамического выделения памяти: результат остаётся в общем буфере ёмкостью 64 байта.

На устройствах с STM32F042 этот модуль недоступен. Включить его из программы на uLua нельзя.

Кодирование

utils.b64enc(str) -> int

Функция кодирует строку str, записывает результат в общий буфер и возвращает его длину. Исходная строка может занимать не более 48 байт; более длинная строка завершит программу ошибкой b64 too long.

local len = utils.b64enc("test")
local i = 0

while i < len do
    hw.print(utils.b64_read(i))
    hw.print(" ")
    i = i + 1
end
hw.print("\n")

Программа напечатает коды байтов строки dGVzdA==. В uLua нет общего преобразования числа в символ, поэтому готовую строку обычно собирает программа на компьютере или устройство передаёт байты своим протоколом.

Декодирование

utils.b64dec(str) -> int

Функция декодирует Base64 в тот же буфер и возвращает число полученных байтов. Пробелы, табуляции, CR и LF во входной строке пропускаются. Первый знак = завершает данные.

local len = utils.b64dec("SGVsbG8=")
local i = 0

while i < len do
    hw.print(utils.b64_read(i))
    hw.print(" ")
    i = i + 1
end
hw.print("\n")

Этот пример напечатает 72 101 108 108 111 — коды байтов слова Hello. Декодированный результат может занимать не более 64 байт. Недопустимый символ или переполнение буфера завершит программу ошибкой b64 decode.

Чтение результата

utils.b64_read(index) -> int

Возвращает байт с индексом index:

  • 0..255, если индекс относится к текущему результату;
  • -1, если индекс выходит за его границы.

И кодирование, и декодирование используют один буфер. Каждый новый вызов b64enc() или b64dec() затирает предыдущий результат. При следующем запуске программы на uLua буфер также считается пустым.

Текущую ёмкость можно узнать из константы utils.b64_buffer_capacity.

Синтаксис строк и ограничения конкатенации описаны в разделе «Язык uLua».