Передача байтового массива в метод сценария lua из C ++ - PullRequest
3 голосов
/ 31 мая 2011

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

Ответы [ 2 ]

5 голосов
/ 31 мая 2011

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

Другие опции:

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

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

2 голосов
/ 31 мая 2011

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

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

lua_pushlightuserdata(L, bufptr);

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

lua_pushlstring (L, bufptr, buflen);

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

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

...