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()

次に、16 進エディタ (ここでは Mac OS で Hex Fiend を使用) で開き、対応を確認します。

六角

ここでは、左側に 16 進数のバイトがあり、右側にテキスト表現があります。左側にあるように、0x48 に対応する大文字のHを選択しました。0x48 は、基数 10 で 4*16 + 8 = 72 です (スクリーンショットの一番下のバーを見てください)。

私の最初のコード例を見て、小文字のeのコードが何であるかを推測してください...

最後に、スクリーンショットの最後の 4 行 (バイト 128 から 255) を見てください。これはあなたが見ていたゴミです。

于 2013-07-04T09:14:03.750 に答える