使用 FFI 将二进制数据读取为 Lua 数字

我有一个使用二进制方式打开的文件:local dem = io.open("testdem.dem", "rb")

我可以从中顺利读取出字符串:print(dem:read(8)) -> HL2DEMO,不过之后又有一个 4 字节的小端整数和一个 4 字节的浮点数(文件格式的文档并没有指定是小端,但既然它没有像整数那样指定小端,我就得默认为大端)。 这些内容无法使用 read 方法读取出来。 我新手上路 LuaJIT FFI,不太清楚该怎么读取这些数据。坦白地说,我觉得 FFI 的文档在这个特定方面写得不是很充分,尽管我只是一个 Lua 程序员,并没有太多的 C 语言编程经验。我尝试过的一件事是创建一个 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))
--[[输出
HL2DEMO
luajit: bad argument #1 to 'copy' (cannot convert 'int' to 'void *')
]]--

总结:

目标:从二进制数据中读取整数和浮点数。

预期输出:我可以将其转换为 Lua 整数或浮点数并将其转换为字符串。

点赞
用户1442917
用户1442917

string.unpack 在 Lua 5.3 中可以完成此操作,但是对于 LuaJIT,也有一些替代方法。例如,请参见 此答案(以及同一问题的其他答案)。

2020-05-01 01:23:28