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

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

例如一个二进制文件,经过file:read("*a")读取出所有内容做为一个string返回,其实这个string就是一个二进制的string。可是若是用print打印,则会截断在\0处。这样读取出来的二进制数据,能够直接经过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处理
lua

2)将buffer传入到lua时,使用  lua_pushlstring(l, buf, bufSize); 不要使用lua_pushstring。由于lua_pushstring的实现中,会使用strlen计算字符串长度,对于buffer这显然是错误的。spa

LUA_API void lua_pushstring (lua_State *L, const char *s) {
  if (s == NULL)
    lua_pushnil(L);
  else
    lua_pushlstring(L, s, strlen(s));
}orm


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

相关文章
相关标签/搜索