我只想尝试从二进制文件读取/写入。我一直在关注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
答案 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)来查看对应关系:
这里,在左边,你有十六进制的字节,在右边你有他们的文字表示。我选择了大写 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)