无法在 Lua 5.1 上读取二进制文件的每个字节

,大家好!我一直在尝试将我正在开发的库与最初写于Lua 5.3的库兼容,并且一切进行得相当顺利,直到现在。

我遇到了一种我绝对不知道原因的行为。事情是这样的:显然,在 Lua 5.1上,我不能正确读取二进制文件。为了清晰起见,运行这个测试片段会产生根据所运行的版本而异的不同输出。

local f = io.open("test.bin", "wb")
local t = {}
for i=1, 256 do t[i] = i-1 end
local unpack = unpack or table.unpack
local str = string.char(unpack(t))
f:write(str)
f:close()

f = io.open("test.bin", "rb")
local buffer = {}
for line in f:lines() do
   print(#line)
   for i=1, #line do
      buffer[#buffer+1] = string.byte(line:sub(i,i))
   end
end
print('Total:', #buffer)
f:close()

在使用 Lua 5.1 时:

245
Total:  245

在使用Lua 5.3时:

10
245
Total:  255

所以,我认为,版本5.1仅仅是因为某种原因跳过了文件的第一行。

任何帮助都将不胜感激。

点赞
用户107090
用户107090

这是 Lua 5.1 和 Lua 5.2 中的一个 bug,已经在 Lua 5.3 中进行了修复。

无论如何,不要在二进制文件中使用 f:lines()。而是应该使用 f:read("*a") 读取整个文件或通过块读取。

2017-12-29 12:40:37