Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将cdata结构转换为lua字符串? 我正在编写一个小应用程序,需要在LuaJit读取一些复杂的二进制消息。< /P>_Lua_Ffi_Luajit - Fatal编程技术网

如何将cdata结构转换为lua字符串? 我正在编写一个小应用程序,需要在LuaJit读取一些复杂的二进制消息。< /P>

如何将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 =

我经常使用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 = 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)```