我只是想从二进制文件中读/写.我一直在关注
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
解决方法
如果只将ASCII字符写入文件,则可以在记事本或任何其他文本编辑器中打开它:
- local out = io.open("file.bin","wb")
- local str = string.char(72,101,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(请查看屏幕截图的底部栏,告诉您).
最后查看屏幕截图的最后4行(字节128到255).这是你看到的垃圾.