Как я могу передать массив байтов в качестве аргумента методу сценария lua из кода C++? Разрешены ли только типы данных int, float или string? Также как я могу получить массив байтов из метода сценария lua? Я передам в скрипт необработанный массив байтов. Он будет анализировать и использовать его. Спасибо.
Передача массива байтов в метод скрипта lua из C++
Ответы (2)
Зависит от того, что вы хотите сделать. Строки Lua являются неизменяемыми массивами байтов, поэтому, если они малы, вам, вероятно, лучше всего просто превратить массив байтов в строку с lua_pushlstring
и передать его таким образом --- да, встроенный \0 поддерживается и работает нормально. Но поскольку они неизменяемы, Lua в конечном итоге копирует строку каждый раз, когда вы хотите ее изменить, поэтому она может не соответствовать вашим требованиям.
Другие варианты:
скопируйте данные туда и обратно между вашим байтовым массивом С++ и массивом Lua (то есть таблицей чисел). Это будет довольно дорого в памяти, но, вероятно, это самый простой способ.
оберните массив байтов C++ в lightuserdata и предоставьте привязки Lua, чтобы вы могли получить к нему прямой доступ. Это наиболее эффективно, но это довольно много кода.
Значения Int и float будут преобразованы в числовой тип Lua (по умолчанию double
).
Если самому сценарию просто нужно сохранить указатель для передачи между функциями, блоки данных C обычно отправляются как легкие пользовательские данные:
lua_pushlightuserdata(L, bufptr);
При передаче массивов байтов в Lua обычно используются строки (строки произвольных данных могут быть созданы с помощью lua_pushlstring
):
lua_pushlstring (L, bufptr, buflen);
Это создаст неизменяемую строку в Lua, которую можно изменить только путем создания новых строк.
Если вам нужно работать с изменяемыми байтовыми буферами в Lua (не рекомендуется — низкоуровневые манипуляции с байтами — это то, для чего был разработан C, а не Lua), лучше всего создать тип пользовательских данных для буфера с методами для получения и установки. с учетом варианта использования (отдельные позиции в виде чисел, диапазоны в виде строк или таблиц чисел).