如何将Lua字符串转换为C char*?

我使用了 luajit ffi 库,来包装一个包含一个在 ppm 文件上绘制文本的函数的 C 库:

void drawText(frameBuffer *fb, int px, int py, char* text, pixel color)

当我尝试使用一个字符串从 lua 调用它时,我会得到这个错误 bad argument #4 to 'drawText' (cannot convert 'string' to 'char *')。看起来 lua 字符串库没有任何东西可以将整个字符串转换为字节数组或者我可以充分处理的其他内容。

有什么技巧可以在不修改 C 代码的情况下在 lua 方面实现这个功能吗?

点赞
用户134758
用户134758

你不能将一个 Lua string 直接传递给一个期望一个 char* 类型的 ffi 函数。你需要先将 Lua string 转换为 char* 类型。为此,使用 ffi.new 创建一个新的 C string 变量,然后将你的 Lua string 变量的内容复制到这个新的 C string 变量中。例如:

local text = "text"
-- +1 为零结束标志位
local c_str = ffi.new("char[?]", #text + 1)
ffi.copy(c_str, text)
lib.drawText(fb, px, py, c_str, color)
2015-11-02 19:24:59
用户646619
用户646619

或者,将您的 C 函数重写为接受 const char* 而不是 char*,然后您就可以直接使用 LuaJIT 字符串,而不需要先为它们分配缓冲区。

这意味着函数不能修改传递的字符串,但是在大多数函数中通常不需要这样做。如果您希望传递字符串字面量(因为它们是 const char* 类型),则必须在较新版本的 C 中执行此操作,并且这样做也有很好的 API 设计。

该转换在 FFI Semantics 页面的 从 Lua 对象转换为 C 类型 中有说明。

2015-11-02 21:58:39