lua知识点1-使用lua string作为二进制buffer和c和c++交互



1.Lua中string可以包含二进制数据
如下:
--读取二进制数据
local file = io.open("test.wav", "rb")
local data = file:read("*a")
print("%s", data)  
file:close()
--重新写二进制数据
file = io.open("test2.wav", "wb")
file:write(data)
file:close()


以上,data就是一个二进制的string。
用print打印,则会截断在\0处。
然后我们通过file:write再写回文件中。


2.Lua中string可以作为buffer和c/c++的交互
从lua传入c时,string可以转换为const char*, 而从c返回一个buffer给lua时,也可以push一个string进去。


注意:
(1)从lua传入c时,需要附带传入buffer size


(2)将buffer传入到lua时,使用 lua_pushlstring(l, buf, bufSize)不要使用lua_pushstring
因为lua_pushstring的实现中,会使用strlen计算字符串长度,对于buffer这显然是错误的。
LUA_API void lua_pushstring (lua_State *L, const char *s) {
  if (s == NULL)
    lua_pushnil(L);
  else
    lua_pushlstring(L, s, strlen(s));
}
(3)在lua代码中,如果使用连接操作符..将一个包含二进制数据的string和一个普通string连接,则string
可能被截断为一个普通string。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
C++Lua交互可以通过Lua提供的C API实现。Lua提供了一组C函数,可以在C++中调用这些函数来实现与Lua交互。下面是一个简单的示例: 假设我们有一个Lua脚本文件test.lua,内容如下: ``` -- test.lua function add(a, b) return a + b end ``` 现在我们想在C++中调用这个add函数,可以按照以下步骤实现: 1. 在C++代码中引入Lua的头文件 ```c++ extern "C" { #include "lua.h" #include "lualib.h" #include "lauxlib.h" } ``` 2. 创建一个Lua虚拟机 ```c++ lua_State* L = luaL_newstate(); ``` 3. 加载Lua脚本文件 ```c++ int ret = luaL_dofile(L, "test.lua"); if (ret != LUA_OK) { const char* err = lua_tostring(L, -1); printf("Failed to load script: %s\n", err); lua_close(L); return 1; } ``` 4. 调用Lua函数 ```c++ lua_getglobal(L, "add"); lua_pushnumber(L, 1); lua_pushnumber(L, 2); int ret = lua_pcall(L, 2, 1, 0); if (ret != LUA_OK) { const char* err = lua_tostring(L, -1); printf("Failed to call function: %s\n", err); lua_close(L); return 1; } int result = lua_tonumber(L, -1); printf("Result: %d\n", result); ``` 上面的代码中,我们首先调用lua_getglobal函数获取Lua全局变量add,然后使用lua_pushnumber将两个参数1和2压入栈中,接着调用lua_pcall函数调用函数,并将返回值从栈中弹出,最后使用lua_tonumber获取函数返回值。 需要注意的是,Lua的栈是一个先进后出的数据结构,我们使用lua_push系列函数将数据压入栈中,使用lua_to系列函数获取栈中的数据,使用lua_pop函数将数据从栈中弹出。 总的来说,C++Lua交互可以通过Lua提供的C API实现,需要使用一些基本的函数来操作Lua的栈和调用Lua函数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值