Передача массива байтов в метод скрипта lua из C++

Как я могу передать массив байтов в качестве аргумента методу сценария lua из кода C++? Разрешены ли только типы данных int, float или string? Также как я могу получить массив байтов из метода сценария lua? Я передам в скрипт необработанный массив байтов. Он будет анализировать и использовать его. Спасибо.


person suyuti    schedule 31.05.2011    source источник


Ответы (2)


Зависит от того, что вы хотите сделать. Строки Lua являются неизменяемыми массивами байтов, поэтому, если они малы, вам, вероятно, лучше всего просто превратить массив байтов в строку с lua_pushlstring и передать его таким образом --- да, встроенный \0 поддерживается и работает нормально. Но поскольку они неизменяемы, Lua в конечном итоге копирует строку каждый раз, когда вы хотите ее изменить, поэтому она может не соответствовать вашим требованиям.

Другие варианты:

  • скопируйте данные туда и обратно между вашим байтовым массивом С++ и массивом Lua (то есть таблицей чисел). Это будет довольно дорого в памяти, но, вероятно, это самый простой способ.

  • оберните массив байтов C++ в lightuserdata и предоставьте привязки Lua, чтобы вы могли получить к нему прямой доступ. Это наиболее эффективно, но это довольно много кода.

person David Given    schedule 31.05.2011

Значения Int и float будут преобразованы в числовой тип Lua (по умолчанию double).

Если самому сценарию просто нужно сохранить указатель для передачи между функциями, блоки данных C обычно отправляются как легкие пользовательские данные:

lua_pushlightuserdata(L, bufptr);

При передаче массивов байтов в Lua обычно используются строки (строки произвольных данных могут быть созданы с помощью lua_pushlstring):

lua_pushlstring (L, bufptr, buflen);

Это создаст неизменяемую строку в Lua, которую можно изменить только путем создания новых строк.

Если вам нужно работать с изменяемыми байтовыми буферами в Lua (не рекомендуется — низкоуровневые манипуляции с байтами — это то, для чего был разработан C, а не Lua), лучше всего создать тип пользовательских данных для буфера с методами для получения и установки. с учетом варианта использования (отдельные позиции в виде чисел, диапазоны в виде строк или таблиц чисел).

person Stuart P. Bentley    schedule 31.05.2011