加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

[lua] 使用lua string作为二进制buffer和c/c++交互

发布时间:2020-12-14 22:08:32 所属栏目:大数据 来源:网络整理
导读:遇到一个需求是使用lua读取一个二进制文件或者从网络下载一个二进制文件,然后将文件数据传入一个c函数中处理。先是想到使用userdata,但lua读取文件出来的是一个string,string貌似不能在lua代码中转换为userdata,后来经过研究,发现直接用string就可以作为

遇到一个需求是使用lua读取一个二进制文件或者从网络下载一个二进制文件,然后将文件数据传入一个c函数中处理。先是想到使用userdata,但lua读取文件出来的是一个string,string貌似不能在lua代码中转换为userdata,后来经过研究,发现直接用string就可以作为buffer,因为Lua中string可以包含二进制数据。

例如一个二进制文件,通过file:read("*a")读取出全部内容作为一个string返回,其实这个string就是一个二进制的string。但是如果用print打印,则会截断在处。这样读取出来的二进制数据,可以直接通过file:write再写回文件中。因此在lua中可以处理二进制文件的读写。

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

但是有两点要注意:

1)从lua传入c时,显然只传入string并不够,因为不能使用strlen计算buffer size,因此需要附带传入buffer size,这样才能将const char*作为一个buffer处理

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));
}


另外在lua代码中,如果使用连接操作符..将一个包含二进制数据的string和一个普通string连接,则string可能被截断为一个普通string。这点我没有找到明确的官方资料,也没查看lua代码证实,只是通过测试得到的结论。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读