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».