我想在Lua中编写“映射”而不是在C中编写Lua的简单和美观; - )
让我们说在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中使用一种方法在“结构”内的字段上使用FIXED长度,以便整个BUFFER OFFSETS在到达目标系统时保持一致.......
所以我想在上面的结构中说我想将“field_3”设置为文本“apple”......我仍然希望该结构字段的总长度为2000字节... < /强>
答案 0 :(得分:6)
你可以用Lua做到这一点。
如果您希望(或被迫)继续使用Lua 5.1,请考虑使用struct库。
raw_data = struct.pack("c10c250c2000", field1, field2, field3)
field1, field2, field3 = struct.unpack("c10c250c2000", raw_data)
但是,目前可用的最佳解决方案是LuaJIT;使用LuaJIT比标准的Lua实现有很多好处,但最适用于你的是FFI library。
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是“智能”语言的主要第一步,允许您在任何级别工作。
答案 1 :(得分:3)
Lua不这样做。 Lua没有“结构”。它没有“大小”的“字段”。
它有表格,可以有几种不同类型的值。这些值映射到键(它们本身是值)。虽然您可以使用元表来防止添加新键,但您不能强制将值的“大小”强制为特定的任何内容。
或者,换句话说,停止尝试将Lua编程为C语言。它们是不同的语言,您应该以自己的方式处理每种语言。在C中,您需要关心字段的大小,结构的布局等。
使用Lua(以及大多数脚本语言)的原因是因为不想要关心这些事情。如果字符串“apple”碰巧存储在大小为2000字节的字节数组中,您不必在意。如果你想关心它,那么你不想使用Lua。