Binäre Datei lesen
-
Okay, es funktioniert jetzt.
Aber anstatt mir die Daten binär auzugeben werden sie nach dem ANSCII ausgegeben.
Muss ich die Daten erst noch konvertieren?
-
Marthog schrieb:
EIne kleine Anmerkung zum Stil: Üblicherweise öffnet man die Datei gleich im Konstruktor und nicht später mit ifstream::open.
ifstream in("testcode", ios::binary); // ...
Ich mache es meistens nicht, da ich oft noch andere Dateien mit dem selben Stream öffne
und diese Dateien am Anfang of noch nicht klar sind.
-
coder++ schrieb:
Marthog schrieb:
EIne kleine Anmerkung zum Stil: Üblicherweise öffnet man die Datei gleich im Konstruktor und nicht später mit ifstream::open.
ifstream in("testcode", ios::binary); // ...
Ich mache es meistens nicht, da ich oft noch andere Dateien mit dem selben Stream öffne
und diese Dateien am Anfang of noch nicht klar sind.Das ist kein guter Stil. Denn so verwendest du quasi Variablen für mehr als einen Sinn, das verwirrt. Wenn nicht dich, dann den nächsten, der deinen Code durchwühlt.
-
Da hast du wohl recht.
Aber kann mir jemand vielleicht jetut helfen, wie ich die eingelesen Daten binär ausgebe.
-
Was erwartest du denn? Nullen und Einsen?
-
Lol, irgendwie schon.
Ich meine so, wie ein Hex-Editor es lesen kann, muss es doch irgendwie möglich sein, also ja, mit Nullen und Einsen.
-
Du kannst die Datei Byte für Byte einlesen. Wenn du dich schon an Dateien wagst, solltest du auch ein Byte in einen hexadezimalen bzw. binären String umwandeln können.
-
Ja also ich meine, mit ios::binary sollte er die Datei ja eig. binär lesen.
Aber wenn ich es entferne, wird mir trotzdem das Gleiche ausgegeben.
Die Datei sollte ja schon binär gelesen werden, aber sie wird irgendwie trotzdem nach dem ASCII ausgelesen.
Wie mache ich das?
-
coder++ schrieb:
Ja also ich meine, mit ios::binary sollte er die Datei ja eig. binär lesen.
Aber wenn ich es entferne, wird mir trotzdem das Gleiche ausgegeben.
Die Datei sollte ja schon binär gelesen werden, aber sie wird irgendwie trotzdem nach dem ASCII ausgelesen.
Wie mache ich das?Gelesen wird Byte für Byte(
char
fürchar
).
Bei der Konsolenausgabe werdenchar
s aber eben als ASCII(bzw. die verwendete Codepage) interpretiert. Wenn Du das nicht willst könntest Du z.B. nachunsigned
casten(oder gleich inunsigned
lesen).
Und für die Ausgabe als Hex schau mal hier.
-
Danke
-
Wieder ein Problem
Es klappt jetzt, ich kann die einzelnen Bits sehen (1, 0) hab diese auch in dezinal Zahlen umgewandelt, aber die Datei wird immer noch als Textdatei gelesen und nicht als Binärdatei.
Warum?
Ich benutze doch ios::binary
-
Es gibt nur einen Unterschied zwischen dem binary mode und dem Normalen:
Bei dem Normalen Modus werden Newlines in etwas plattformspezifisches konvertiert wie "\r\n" unter Windows. Im binary mode entfällt das. Mehr Unterschied ist da nicht.
So oder so landen am Ende in der Datei binäre Dateien, die von einem Texteditor als Zeichen interpretiert werden.
-
Achso.
Aber ich mein ja nur:
Wenn ich die Binärdateie mit einem normalen Texteditor öffne sehe ich nur eine Sammlung Zeichen.
Nur mit einem Hex-Editor kann ich sie richtig lesen.
Wenn ich aber versuche die Bytes einzeln einzulesen mit ifstream, dann kommt das Gleiche herraus, wie im Texteditor.
-
coder++ schrieb:
Achso.
Aber ich mein ja nur:
Wenn ich die Binärdateie mit einem normalen Texteditor öffne sehe ich nur eine Sammlung Zeichen.
Nur mit einem Hex-Editor kann ich sie richtig lesen.
Wenn ich aber versuche die Bytes einzeln einzulesen mit ifstream, dann kommt das Gleiche herraus, wie im Texteditor.die (teils unlesbaren) zeichen im texteditor sind von den werten her gleich wie die im hexeditor, nur anders dargestellt eben. wenn du also einen char aus einer datei liest und du den numerischen wert ausgeben möchtest, dann musst du den char in einen int z.b. casten. die daten sind überall (editor, hexeditor, char, int) gleich, die unterschiede liegen in der darstellung.
-
coder++ schrieb:
Wenn ich die Binärdateie mit einem normalen Texteditor öffne sehe ich nur eine Sammlung Zeichen.
Der Texteditor ist nunmal für Text da.
Darum stellt er die Daten als Text dar.
-
Das heißt, ich muss Binärdateien nicht binär lesen?
Und außerdem, kann es sein dass Hex ein anderer Standard ist?
Also dass z.B. 85 gleich "U" in ASCII ist, aber in Hex ein anderes Zeichen?
-
coder++ schrieb:
Das heißt, ich muss Binärdateien nicht binär lesen?
Und außerdem, kann es sein dass Hex ein anderer Standard ist?
Also dass z.B. 85 gleich "U" in ASCII ist, aber in Hex ein anderes Zeichen?hä, ich versteh nicht was du ausdrücken möchtest. wenn du ein byte liest, dann kann das gelesene byte gleichzeitig 85, 'U', 0x55 und 0101 0101 sein. der wert ist immer gleich, egal ob man "binär oder hex liest". (was man gar nicht unterscheiden kann in diesem kontext...)
-
Der Unterschied zwischen Text und Binärmodus ist, das die Umsetzung vom Zeilenende in '\n'. Unter DOS/Windows ist das Zeilenende \r\n (Carriage Return und Line Feed (newline) CR LF).
Diese Umsetzung wird im Binärmodus nicht gemacht.Der Rest ist alles nur ein Problem der Darstellung.
ASCII kennst du ja. Da hast du 'A' oder
Bei der allgemein übliche Dezimaldarstellung 65 oder
als Hexadezimalwert zur Basis 16 ist das 0x41 oder
auch als Oktaldratsellung zur Basis 8 dann 0101 oder
als Dualzahl (Basis 2) 0b01000001Alles nur eine andere Darstellung vom selben Wert.
-
Vergesst das Vorherige.
Ich habs nun vertstanden.
Und wenn ichs richtig verstanden hab, muss ich die Werte einfach nur in Hexadezimal umwandeln und schon hab ich einen Maschinencode, den ich bearbeiten kann.
Bin ich damit richtig?
Und ausserdem, woher soll ich wissen, welches Zähl-System der Prozessor benutzt?
-
coder++ schrieb:
Vergesst das Vorherige.
Ich habs nun vertstanden.
Und wenn ichs richtig verstanden hab, muss ich die Werte einfach nur in Hexadezimal umwandeln und schon hab ich einen Maschinencode, den ich bearbeiten kann.
Bin ich damit richtig?
Und ausserdem, woher soll ich wissen, welches Zähl-System der Prozessor benutzt?Nein.
Wenn du Zahlen/Buchstaben/was auch immer einliest, werden 0 und 1en (binär eben...) eingelesen und an der Adresse der Variable gespeichert. Gibts du diese binär-Daten aus, hängt das vom Typ ab, in dem sie gespeichert werden, wie sie ausgegeben werden. Die ostreams geben char als Zeichen aus und konvertieren eine Zahl in die entsprechende Folge von Zeichen.
Um beim 'A' zu bleiben. In der Datei steht 01000001. Liest du das in einem char ein, steht da auch 01000001. Gibst du das allerdings aus (via cout oder in eine Datei) wird das dem ASCII Code entsprechende Zeichen ausgegeben ('A'). Gibts du das aber als int aus, wird die Zahl 65 als zwei Zeichen '6' und '5' ausgegeben.
Der Texteditor sieht an der selben Stelle auch 01000001, ist aber eingstellt Zeichen auszugeben, deshalb siehst du 'A'.
Der Binäreditor hat ebenfalls 01000001, ist aber darauf eingstellt, das als Zahl einzulesen und diese Zahl hexadezimal auszugeben, deshalb siehst du (0x)41.
Die interne Repräsentation ist aber immer 01000001.