Pack
Этот модуль содержит функции для упаковки данных в строку Lua и распаковки данных из строки Lua. Данные кодируются в виде строки с шестнадцатеричным представлением (например, бинарное значение 0x0102 представлено строкой “0102”).
Функции упаковки полезны, например, для упаковки данных перед отправкой через протокол LoraWAN и для распаковки данных, полученных из протокола LoraWan.
Этот модуль работает на основе следующих предположений:
- Данные находятся в формате с младшим значащим байтом на низком адресе (little-endian).
- Целые числа имеют длину 32 бита.
- Числа с плавающей запятой представлены в формате IEEE 754 одинарной точности и имеют длину 32 бита.
- Булевы значения представлены в байте (1 = true, 0 = false).
- Строки заканчиваются нулевым символом (0x00).
Данные упаковываются в строку с шестнадцатеричным представлением, с таким форматом:
-
Заголовок
- Первый байт: количество значений, упакованных в строке.
- N байтов с информацией о типе данных каждого упакованного значения. Каждый байт содержит информацию о двух упакованных значениях, по одному на каждую половину байта (nibble). Типы данных кодируются следующим образом:
- 0b0000: Число
- 0b0001: Целое число
- 0b0010: Nil
- 0b0011: Булево значение
- 0b0100: Строка
-
N байтов данных
Строка упаковки (без пробелов) для 1 (целое число), true (булево значение), nil и 4 (целое число):
03 13 20 01000000 01 04000000
03 - количество упакованных значений, в данном случае 3.
13 - тип первого и второго упакованных значений: целое число и булево значение.
20 - тип третьего и четвертого упакованных значений: nil и целое число.
01000000: 1 (целое число)
01 : true (булево значение)
04000000: 4 (целое число)
Обратите внимание, что значение nil присутствует только в заголовке и не имеет представления в данных.
pack.pack(val1 [, val2, …, valn])
Упаковывает значения в строковое представление в шестнадцатеричном формате.
Аргументы:
- val1: первое значение.
- val2: второе значение (необязательно).
- ….
Возвращает: строку со значениями, упакованными внутри, или исключение.
-- Pack the values 1 (integer), true (boolean) and 1.2 (number)
pack.pack(1, true, 1.2)
pack.unpack(string, [only first])
Распаковывает значения, закодированные в строковом представлении в шестнадцатеричном формате.
Аргументы:
- string: строка с упакованными значениями.
- only first: распаковывать только первое значение (необязательно).
- ….
Возвращает:
-
если аргумент only first равен true, распакованное значение и строку с оставшимися упакованными значениями (или nil, если больше нет значений), или исключение.
-
если аргумент only first равен false или не указан, распакованное значение, или исключение.
-- Pack the values 1 (integer), true (boolean) and 1.2 (number)
p = pack.pack(1, true, 1.2)
-- Unpack the values
a, b, c = pack.unpack(p)
-- Pack the values 1 (integer), true (boolean) and 1.2 (number)
p = pack.pack(1, true, 1.2)
-- Unpack the values
-- Unpack first value, a = 1
a, p = pack.unpack(p, true)
-- Unpack next value, b = true
b, p = pack.unpack(p, true)
-- Unpack next value, c = 1.2
c, p = pack.unpack(p, true)
-- Unpack next value, d = nil, p = nil
d, p = pack.unpack(p, true)