8

我只是想从二进制文件中读/写。我一直在关注教程,它可以工作......除了它似乎正在将内容写入 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
4

2 回答 2

14

如果您只将 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)来查看对应关系:

十六进制

在这里,左边是十六进制的字节,右边是它们的文本表示。我选择了大写H,如您在左侧看到的,对应于 0x48。0x48 是 4*16 + 8 = 72,以 10 为底(查看屏幕截图的底部栏,它会告诉您这一点)。

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

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

于 2013-07-04T09:14:03.750 回答
-1

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

我在旧电脑上创建的关卡和我的新游戏每关 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 ,得到字符串)

于 2017-05-26T20:46:13.477 回答