如何将cdata结构转换为lua字符串? 我正在编写一个小应用程序,需要在LuaJit读取一些复杂的二进制消息。< /P>
我经常使用bit模块和string.rep。然而,这一切都很麻烦。我对使用LuaJit还不熟悉,我认为可能有一种更简单的使用FFI的方法 在C中,我可以声明如下结构:如何将cdata结构转换为lua字符串? 我正在编写一个小应用程序,需要在LuaJit读取一些复杂的二进制消息。< /P>,lua,ffi,luajit,Lua,Ffi,Luajit,我经常使用bit模块和string.rep。然而,这一切都很麻烦。我对使用LuaJit还不熟悉,我认为可能有一种更简单的使用FFI的方法 在C中,我可以声明如下结构: struct mystruct { uint32_t field1; char field2[6]; uin64_t field3; short field4; } __attribute__(packed); local ms = ffi.new("mystruct") ms.field1 =
struct mystruct
{
uint32_t field1;
char field2[6];
uin64_t field3;
short field4;
} __attribute__(packed);
local ms = ffi.new("mystruct")
ms.field1 = 32;
// ... etc
在阅读LuaJit的FFI时,您似乎可以声明
ffi.cdef[[
#pragma pack(1)
struct mystruct
{
uint32_t field1;
char field2[6];
uin64_t field3;
short field4;
};
]]
然后我可以创建一个mystruct并访问如下字段:
struct mystruct
{
uint32_t field1;
char field2[6];
uin64_t field3;
short field4;
} __attribute__(packed);
local ms = ffi.new("mystruct")
ms.field1 = 32;
// ... etc
但是,如何将其转换回lua字符串
我试过了,但似乎没有达到我的目的
local s = tostring(ms)
这是:
local s = ffi.string(ms)
产生以下错误“将错误参数#1转换为'string'(无法将'struct mystruct'转换为'const char*')”
所以我试了一个演员:
local s = ffi.string(ffi.cast("char*", ms))
没有错误,但在导线上看起来是错误的。与非字符串参数一起使用时,必须明确指定长度: str=ffi.string(ptr[,len]) 从ptr指向的数据创建一个内部Lua字符串 如果缺少可选参数len,则将ptr转换为“char*”,并假定数据以零结尾。字符串的长度是用strlen()计算的 在运行以下代码时,我得到了预期的(little endian)结果: 更新:我知道这不是原始问题的一部分,但我刚刚学会了这个技巧,为了完整起见,这里有一种将Lua字符串转换回FFI cdata的方法:
data = ffi.new('struct mystruct') -- create a new cdata
ffi.copy(data, s, ffi.sizeof(data)) -- fill it with data from Lua string 's'
print(data.field1, data.field4) --> 1 9
前一个有一个错误。
根据当前的luaffi实现,您可以将其强制转换为
void*
。使用ffi.string(ffi.cast(“void*”,ms),ffi.sizeof(ms))
这样做。oops,应该打包而不是打包。修正了。你说的“电线看起来有问题”是什么意思?你看到了什么?你期望/想看什么?它不必被复制。一个简单的cast
就可以了本地st=ffi.cast('struct mystruct*',s)打印(st.field4)```