"C like struct"在Lua进行长时间缓冲区操作?



为了Lua的简洁和美观,我想用Lua而不是用C来编码"映射";-)

因此,假设在C中,我本可以有以下内容:

typedef struct my_struct{
    char field_1[10];                              
    char field_2[250];                                
    char field_3[2000];                              
}my_struct;
my_struct   *pmy_struct;
pmy_struct = (my_struct *) some_buffer;

所以我想在Lua中找到一种方法,在"结构"内的字段上有固定的长度,这样当到达目标系统时,整个缓冲偏移保持不变。。。。

所以,假设在上面的结构中,我想将"field_3"设置为文本"apple"。。。。。。我仍然希望该结构字段的总长度为2000字节

您可以使用Lua来完成此操作。

如果您希望(或被迫)使用Lua 5.1,请考虑使用结构库。

raw_data = struct.pack("c10c250c2000", field1, field2, field3)
field1, field2, field3 = struct.unpack("c10c250c2000", raw_data)

然而,目前可用的最佳解决方案是LuaJIT;与标准Lua实现相比,使用LuaJIT有很多好处,但最适用于您的是FFI库。

local ffi = require"ffi"
ffi.cdef[[
    typedef struct {
        char field_1[10];                              
        char field_2[250];                                
        char field_3[2000];                              
    } my_struct;
]]
local my_thing = ffi.new("my_struct")
my_thing.field_1 = "Ain't"
my_thing.field_2 = "this"
my_thing.field_3 = "great? :D"
local ptr_my_thing = ffi.new("my_struct*", my_thing)
ptr_my_thing.field_2 = [[
    LuaJIT does a great job at figuring out
    what you're trying to do.
]]
ptr_my_thing.field_3 = [[
    There are some cases where the generics of
    Lua cannot be used to infer information,
    so have a look at the LuaJIT site for specifics.
]]
print(ffi.string(ptr_my_thing.field_2))

一种常见的误解是,像Lua和Python这样的通用语言不应该(或者,在无知的情况下,不能)用于低级细节。LuaJIT是"智能"语言的重要第一步,它允许您在任何级别上工作。

Lua不是这样工作的。Lua没有"结构"。它没有具有"大小"的"字段"。

它有一些表,这些表可以具有几种不同类型的值。这些值被映射到键(键本身就是值)。虽然可以使用元表来防止添加新键,但不能强制值的"大小"为任何特定的值。

或者,换一种说法,停止尝试像C一样对Lua进行编程。它们是不同的语言,你应该以自己的方式处理每种语言。在C中,您需要关心字段的大小、结构的布局等。

使用Lua(以及大多数脚本语言)的原因是因为不想关心这些事情。如果字符串"apple"恰好存储在一个2000字节大小的字节数组中,您不必在意。如果你想关心这一点,那么你就不想使用Lua。

最新更新