72 lines
2.7 KiB
Markdown
72 lines
2.7 KiB
Markdown
# Библиотека *byteutil*
|
||
|
||
Библиотека предоставляет функции для работы с массивами байт, представленными в виде таблиц или Bytearray.
|
||
|
||
```lua
|
||
byteutil.pack(format: str, ...) -> Bytearray
|
||
byteutil.tpack(format: str, ...) -> table
|
||
```
|
||
|
||
Возвращает массив байт, содержащий переданные значения, упакованные в соответствии со строкой формата. Аргументы должны точно соответствовать значениям, требуемым форматом.
|
||
|
||
Строка формата состоит из специальных символов и символов значений.
|
||
|
||
Специальные символы позволяют указать порядок байт для последующих значений:
|
||
|
||
| Символ | Порядок байт |
|
||
| ------ | -------------------- |
|
||
| `@` | Системный |
|
||
| `=` | Системный |
|
||
| `<` | Little-endian |
|
||
| `>` | Big-endian |
|
||
| `!` | Сетевой (big-endian) |
|
||
|
||
|
||
Символы значений описывают тип и размер.
|
||
|
||
| Символ | Аналог в С++ | Тип Lua | Размер |
|
||
| ------ | ------------ | -------- | ------- |
|
||
| `b` | int8_t | number | 1 байт |
|
||
| `B` | uint8_t | number | 1 байт |
|
||
| `?` | bool | boolean | 1 байт |
|
||
| `h` | int16_t | number | 2 байта |
|
||
| `H` | uint16_t | number | 2 байта |
|
||
| `i` | int32_t | number | 4 байта |
|
||
| `I` | uint32_t | number | 4 байта |
|
||
| `l` | int64_t | number | 8 байта |
|
||
| `L` | uint64_t | number | 8 байта |
|
||
|
||
> [!WARNING]
|
||
> Из-за отсутствия в Lua целочисленного типа для значений `l` и `L` гарантируется
|
||
> только выходной размер в 8 байт, значение может отличаться от ожидаемого.
|
||
|
||
```lua
|
||
byteutil.unpack(format: str, bytes: table|Bytearray) -> ...
|
||
```
|
||
|
||
Извлекает значения из массива байт, ориентируясь на строку формата.
|
||
|
||
Пример:
|
||
|
||
```lua
|
||
debug.print(byteutil.tpack('>iBH?', -8, 250, 2019, true))
|
||
-- выводит:
|
||
-- debug.print(
|
||
-- {
|
||
-- 255,
|
||
-- 255,
|
||
-- 255,
|
||
-- 248,
|
||
-- 250,
|
||
-- 7,
|
||
-- 227,
|
||
-- 1
|
||
-- }
|
||
-- )
|
||
|
||
local bytes = byteutil.pack('>iBH?', -8, 250, 2019, true)
|
||
debug.print(byteutil.unpack('>iBH?', bytes))
|
||
-- выводит:
|
||
-- -8 250 2019 true
|
||
```
|