3

Lua のシンプルさと美しさのために、C ではなく Lua で「マッピング」をコーディングしたいと考えています ;-)

したがって、CI では次のようなことができたとしましょう。

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バイトにしたいと考えています...

4

2 に答える 2

6

これは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は、あらゆるレベルでの作業を可能にする「スマート」言語の主要な最初のステップです。

于 2012-07-31T05:31:22.580 に答える
3

Luaはそのようには機能しません。Lua には「構造」がありません。「サイズ」を持つ「フィールド」はありません。

いくつかの異なるタイプの値を持つことができるテーブルがあります。これらの値はキー (それ自体が値) にマップされます。メタテーブルを使用して新しいキーの追加を防ぐことはできますが、値の「サイズ」を特定のものに強制することはできません。

または、別の言い方をすれば、 Lua を C のようにプログラムしようとするのをやめるということです。これらは異なる言語であり、それぞれの言語に独自の方法でアプローチする必要があります。C では、フィールドのサイズ、構造体のレイアウトなどに注意する必要があります。

Lua (およびほとんどのスクリプト言語) を使用する理由は、これらのことを気にしたくないからです。文字列 "apple" がたまたま 2000 バイトのバイト配列に格納されていても、気にする必要はありません。そして、それを気にしたいのであれば、Lua を使いたくありません。

于 2012-07-23T07:37:29.080 に答える