我正在编写一个需要在 LuaJit 中读取一些复杂二进制消息的小应用程序。
我一直在使用 bit 模块和 string.rep 很多。然而,这一切都非常麻烦。我是使用 LuaJit 的新手,我认为使用 FFI 可能会更简单。
在 CI 中可以声明这样的结构:
struct mystruct
{
uint32_t field1;
char field2[6];
uin64_t field3;
short field4;
} __attribute__(packed);
在阅读 LuaJit 的 FFI 时,您似乎可以声明
ffi.cdef[[
#pragma pack(1)
struct mystruct
{
uint32_t field1;
char field2[6];
uin64_t field3;
short field4;
};
]]
然后我可以创建一个 mystruct 并访问如下字段:
local ms = ffi.new("mystruct")
ms.field1 = 32;
// ... etc
但是,如何将其转换回 lua 字符串?
我试过这个,但它似乎没有达到我想要的效果。
local s = tostring(ms)
还有这个:
local s = ffi.string(ms)
产生以下错误“bad argument #1 to 'string' (cannot convert 'struct mystruct' to 'const char *')”
所以我尝试了一个演员表:
local s = ffi.string(ffi.cast("char*", ms))
没有错误,但在电线上看起来有问题。