voxelcore/doc/ru/scripting/bytearray.md

4.6 KiB
Raw Blame History

Класс Bytearray

Bytearray - динамический байтовый массив, реализованный через LuaJIT FFI. По нему можно итерироваться стандартными функциями pairs и ipairs

Основное

Создание массива

local bytes = Bytearray()           -- пустой
local bytes = Bytearray("hello")    -- из строки
local bytes = Bytearray({1,2,3})    -- из таблицы чисел

Методы

-- Добавляет элемент(ы) в конец массива.
bytes:append(value: int)
bytes:append(values: Bytearray | table<int>)

-- Вставляет данные по индексу.
bytes:insert(index: int, value: int)

-- Удаляет элемент(ы), если передан `count`, удалит `count` кол-во элементов с выбранного индекса.
bytes:remove(index: int, [опционально] count: int)

-- Очищает массив.
bytes:clear()

--[[
Заполняет массив определённым байтом полностью либо в определённом диапазоне.
Логика работы следующая: если параметр size или index равны nil, то указанным байтом будет заполнен весь массив,
    иначе будет заполнен диапазон внутри массива начиная с индекса index и размером size.
В случае выхода заполняемого блока за границы массива генерирует соответствующую ошибку.
]]
bytes:fill(index: posint/nil, size: posint/nil, byte: uint8)

-- Создаёт новый Bytearray, содержащий копию части данных с offset до offset+length
bytes:slice(offset: int, length: int) -> Bytearray

--[[
Копирует блок байт из исходного массива, начиная с индекса srcindex, в массив dst, начиная в нём с индекса dstindex.
В случае выхода за границы исходного, конечного массива, либо при некорректном значении параметра size генерирует соответствующую ошибку.
]]
bytes:copy(srcindex: posint, dst: Bytearray, dstindex: posint, size: posint)

--[[
Безопасно копирует перекрывающиеся области памяти (байт) в пределах одного массива.
В случае выхода за пределы массива начального или конечного диапазона байт генерирует соответствующую ошибку.
]]
bytes:move(fromindex: posint, toindex: posint, size: posint)

View

Это "вьюшки" поверх Bytearray, которые интерпретируют его байты как массив чисел другого размера - без копирования данных.

Не имеет своих методов, является просто объектной ссылкой на оригинальный Bytearray.

Класс Тип элементов Размер
I16view int16_t 2 байта
U16view uint16_t 2 байта
I32view int32_t 4 байта
U32view uint32_t 4 байта
F32view float 4 байта*

* Размеры "оригинальных" C-шных типов являются платформозависимыми и их точный размер не описан в стандарте языка. В данной таблице предоставлены наиболее распространённые размеры типов.

Специфические методы "вьюшек"

-- Возвращает размер типа вьюшки (полезно для вьюшек, использующих C-шные типы нефиксированного размера: те же float или double).
view:typesize() -> posint

Пример использования

local bytes = Bytearray({1, 0, 2, 0, 250, 255})

local u16 = U16view(bytes)
local i16 = I16view(bytes)

print(u16[1]) -- 1
print(u16[2]) -- 2
print(i16[3]) -- -6 (signed вьюшка)

for _, num in ipairs(i16) do
    print(num)
end -- 1; 2; -6