如何将cdata结构转换为lua字符串?

时间:2012-09-10 00:22:20

标签: lua ffi luajit

我正在编写一个需要在LuaJit中读取一些复杂二进制消息的小应用程序。

我一直在使用bit模块和string.rep。然而,这一切都非常麻烦。我是使用LuaJit的新手,并认为使用FFI可能会更容易。

在C中我可以声明这样的结构:

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)

产生以下错误“错误的参数#1到'字符串'(不能将'struct mystruct'转换为'const char *')”

所以我尝试了演员:

local s = ffi.string(ffi.cast("char*", ms))

没有错误,但在线上看起来不对。

1 个答案:

答案 0 :(得分:0)

上一个有错误。 根据当前的luaffi实现,可以将其强制转换为void*。使用ffi.string(ffi.cast("void*",ms),ffi.sizeof(ms))这样做。