2013-07-04 6 views
6

Ich versuche nur, aus einer Binärdatei zu lesen/schreiben. Ich habe this Tutorial gefolgt, und es funktioniert ... außer es scheint Dinge in eine TXT-Datei zu schreiben. Ich habe die Datei test.bin beim Testen benannt, aber Notepad kann sie öffnen und korrekt anzeigen, also glaube ich nicht, dass es eine Binärdatei ist. Ich habe es gesagt, dass es eine binäre Datei mit "wb" und "rb" oder?Binärdateien lesen/schreiben

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 
+3

Eine Textdatei * ist * eine Art von Binär-Datei. – greatwolf

+0

Wahrscheinlich kann das Lesen/Schreiben von Textdateien, die ohne 'b' Option geöffnet wurden, bei' '\ x1A'' Zeichen enden. Um dies zu vermeiden, wurde die Option "b" eingeführt. –

+0

http://www.cplusplus.com/forum/general/33808/ Der zweite Beitrag in diesem Artikel klärte für mich auf. In meiner C++ - Klasse wurde uns beigebracht, dass binäre Dateien völlig getrennte Dinge sind, die für Menschen unlesbar sein sollen, so dass ich ziemlich verwirrt war, als ich es richtig mit dem Notizblock lesen konnte.Das heißt, wenn Sie die binären Speicherdateien der meisten Spiele öffnen, wird es als völlig unkenntlich Müll angezeigt, so dass ich nicht helfen kann, aber ich habe das Gefühl, dass etwas fehlt. –

Antwort

11

Wenn Sie nur ASCII-Zeichen in eine Datei schreiben, wird es möglich sein, sie im Editor zu öffnen oder einem anderen Texteditor ganz gut:

:

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

Die resultierende Datei enthält

Hello 

Auf der anderen Seite, wenn Sie echte Binärdaten (für Bytes Zufall Instanz) schreiben Sie Müll bekommen:

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

Dies ist vergleichbar mit den Videospiel speichern Dateien, die Sie gesehen haben.

Wenn Sie es noch nicht erhalten, versuchen alle möglichen Oktetts in eine Datei zu schreiben:

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

und dann öffnen mit einem Hex-Editor (hier verwendete ich Hex Fiend auf Mac OS) zu sehen, um die Korrespondenzen:

hex

hier auf der linken Seite, um die Bytes in hexadezimale haben und auf der rechten Seite Sie ihre Textdarstellung haben. Ich habe Großbuchstaben H ausgewählt, die, wie Sie auf der linken Seite sehen, 0x48 entspricht. 0x48 ist 4 * 16 + 8 = 72 in der Basis 10 (schau dir die untere Leiste des Screenshots an, die dir das sagt).

Nun ein Blick auf meine erste Codebeispiel und erraten, was der Code für Klein e ist ...

Und schließlich Blick auf die vier letzten Zeilen der Screenshot (Bytes 128 bis 255). Das ist der Müll, den du gesehen hast.

0

Ich verstehe nicht, wie binäre Dateien

Mein Ebenen auf alten Computer und mein neues Spiel kann liest es 2200 Bytes Ich verstehe immer noch nicht jeder Ebene von 129

erstellt schreiben, wie ich kann xdata (Füllstandsdaten) Tabelle kann in Datei schreiben.

 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 bis CHAR Zahl erwartet, bekam string)