读/写二进制文件

时间:2013-07-04 04:52:45

标签: lua binaryfiles

我只想尝试从二进制文件读取/写入。我一直在关注this教程,它有效...除了它似乎是在写一个txt文件。我在测试时将文件命名为test.bin,但记事本可以打开它并正确显示,所以我不认为它实际上是一个二进制文件。我告诉它它是一个带有" wb"的二进制文件。和" rb"正确?

if arg[1] == "write" then
    local output = assert(io.open(arg[2], "wb"))

    output:write(arg[3]) --3rd argument is written to the file.

    assert(output:close())
elseif arg[1] == "read" then
    local input = assert(io.open(arg[2], "rb"))

    print(input:read(1)) --Should read one byte, not one char/int. Right?
end

2 个答案:

答案 0 :(得分:11)

如果您只将ASCII字符写入文件,则可以在记事本或任何其他文本编辑器中打开它:

local out = io.open("file.bin", "wb")
local str = string.char(72,101,108,108,111,10) -- "Hello\n"
out:write(str)
out:close()

生成的文件将包含:

Hello

另一方面,如果您编写真正的二进制数据(例如随机字节),您将获得垃圾:

local out = io.open("file.bin", "wb")
local t = {}
for i=1,1000 do t[i] = math.random(0,255) end
local str = string.char(unpack(t))
out:write(str)
out:close()

这类似于您见过的视频游戏保存文件。

如果仍然没有得到它,请尝试将所有可能的八位字节写入文件:

local out = io.open("file.bin", "wb")
local t = {}
for i=0,255 do t[i+1] = i end
local str = string.char(unpack(t))
out:write(str)
out:close()

然后用十六进制编辑器打开它(这里我在Mac OS上使用Hex Fiend)来查看对应关系:

hex

这里,在左边,你有十六进制的字节,在右边你有他们的文字表示。我选择了大写 H ,正如您在左侧看到的那样,它对应于0x48。 0x48是基数10中的4 * 16 + 8 = 72(请查看屏幕截图的底栏,告诉您)。

现在看看我的第一个代码示例,猜猜小写 e 的代码是什么......

最后查看屏幕截图的最后4行(字节128到255)。这是你看到的垃圾。

答案 1 :(得分:0)

我不明白如何编写二进制文件

我在旧计算机上创建的关卡和我的新游戏可以读取它 每个级别129个2200字节

我还是不明白我怎么能用xdata(级别数据)表 可以写入文件。

     function xdatatoline (levelnumber,xdata)
        local out = io.open("file.bin", "wb")
        local t = xdata
        --for i=1,1000 do t[i] = math.random(0,255) end
        local str = string.char(unpack(t))
        out:write(str)
        out:close()
     end 

BAD ARGUMENT#1 to CHAR number expected,got string)