Pack

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)