我正在研究一个使用Lua字符串并将其转换为C字符串的项目-当然,这一点都不困难。但是,在尝试将函数的二进制表示形式(即由对string.dump
的调用产生的函数形式)转换为C字符串时遇到麻烦。我在读取整个字符串时遇到麻烦。
尽管这不是项目的最终目标,但请考虑以下简单示例,在该示例中,我使用一个已注册要在Lua中使用的名为chars
的C函数来逐一打印字符串中的字符:
static void chars(char* cp) {
char* pointer = cp;
while (*pointer) {
printf("%c\n", *pointer);
++pointer;
}
return;
}
static int lua_chars(lua_State* L) {
lua_len(L, 1);
size_t len = static_cast<size_t>(lua_tonumber(L, -1)) + 1;
lua_pop(L, 1);
if (len > 0) {
char* cp = static_cast<char*>(malloc(len));
strcat(cp, lua_tostring(L, 1));
chars(cp);
free(cp);
}
return 0;
}
从Lua脚本中调用
chars
看起来像这样:chars("Hello World!")
并一一打印出字符,然后再换行。
现在到实际问题。考虑以下示例,我在Lua中声明一个函数,将其转储为
string.dump
,然后将该字符串传递给函数chars
以分别打印出其字符:local function foo()
print("foo")
return
end
local s = assert(string.dump(foo))
chars(s)
未完全用我的函数
s
打印的字符串chars
看起来像这样:uaS?
xV(w@=stdin@A@$@&?&?printfoo_ENV
但是,
chars
仅输出前五个字节:u
a
S
(请注意,在“u”之前应该有两行空格。)
我几乎可以肯定这是由于字符串中的空字符所致,我认为这会干扰
lua_tostring
的功能。我遇到过lua_Writer
来读取块,但是我不知道如何使用/编码它。如何将Lua堆栈上的整个字符串成功转换为C字符串? 最佳答案
是的,这完全是因为Lua字符串可以包含零。
这是错误的。 lua_tostring()
可以正常工作。您正在使用的只是strcat()
,只会将数据复制到最接近的零字节。
如果您需要复制字符串,请使用memcpy
,将指向Lua字符串数据的指针和Lua字符串长度(lua_len
,lua_rawlen
等)传递给它。
但是,仅用于打印,您甚至不需要复制任何内容。将len
变量作为参数传递给chars()
,并检查该长度而不是等待零字节。
关于c++ - 将Lua函数块转换为C字符串,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52602923/