使用 FFI 将二进制数据读取为 Lua 数字
Read binary data as Lua number with FFI
我有一个以二进制形式打开的文件,如下所示:local dem = io.open("testdem.dem", "rb")
我可以很好地从中读出字符串:print(dem:read(8))
-> HL2DEMO
,但是,之后有一个 4 字节的小端整数和一个 4 字节的浮点数(文件格式的文档不指定 endianess 但因为它没有像整数那样指定 little 我将不得不假设很大)。
这不能用 read
读出。
我是 LuaJIT FFI 的新手,不确定如何阅读。坦率地说,尽管我只是一名 lua 程序员并且对 C 没有太多经验,但我发现有关 FFI 这一特定方面的文档并不令人印象深刻。我尝试过的一件事是创建一个 cdata,但是我不认为我明白:
local dem = io.open("testdem.dem", "rb")
print(dem:read(8))
local cd = ffi.new("int", 4)
ffi.copy(cd, dem:read(4), 4)
print(tostring(cd))
--[[Output
HL2DEMO
luajit: bad argument #1 to 'copy' (cannot convert 'int' to 'void *')
]]--
总结:
目标:从二进制数据中读取整数和浮点数。
预期输出:一个 lua 整数或浮点数,然后我可以将其转换为字符串。
string.unpack does this for Lua 5.3, but there are some alternatives for LuaJIT as well. For example, see this answer(以及同一问题的其他答案)。
我有一个以二进制形式打开的文件,如下所示:local dem = io.open("testdem.dem", "rb")
我可以很好地从中读出字符串:print(dem:read(8))
-> HL2DEMO
,但是,之后有一个 4 字节的小端整数和一个 4 字节的浮点数(文件格式的文档不指定 endianess 但因为它没有像整数那样指定 little 我将不得不假设很大)。
这不能用 read
读出。
我是 LuaJIT FFI 的新手,不确定如何阅读。坦率地说,尽管我只是一名 lua 程序员并且对 C 没有太多经验,但我发现有关 FFI 这一特定方面的文档并不令人印象深刻。我尝试过的一件事是创建一个 cdata,但是我不认为我明白:
local dem = io.open("testdem.dem", "rb")
print(dem:read(8))
local cd = ffi.new("int", 4)
ffi.copy(cd, dem:read(4), 4)
print(tostring(cd))
--[[Output
HL2DEMO
luajit: bad argument #1 to 'copy' (cannot convert 'int' to 'void *')
]]--
总结:
目标:从二进制数据中读取整数和浮点数。
预期输出:一个 lua 整数或浮点数,然后我可以将其转换为字符串。
string.unpack does this for Lua 5.3, but there are some alternatives for LuaJIT as well. For example, see this answer(以及同一问题的其他答案)。