Binäre Datei lesen



  • Hallo Zusammen.

    Ich hab dazu nichts für mich aufschlussreiches gefunden.

    Also:
    Ich versuche einen Maschinencode binär einzulesen und ihn anzuzeigen, natürlich binär.

    Mein Versuch war folgender:

    ifstream in;
    char get;
    in.open ("testcode", ios::binary);
    if (in){
        while (in.get (&get, sizeof (get))){
            cout << get;
        }
    }
    

    Danke schon mal im Voraus.



  • Vielleicht solltest du auch eine Frage stellen?


  • Mod

    Du willst istream::get(char&) , nicht istream::get(char *, streamsize) . Die machen ganz was unterschiedliches und letzteres macht mit einer siye von 1 überhaupt keinen Sinn, da es dann einfach gar nichts tut.

    http://www.cplusplus.com/reference/istream/istream/get/



  • Ja also meine Frage ist,wie man eben die Daten binär einliest.

    Und okay danke,ich werd mal nachkuken, was die verschiedenen Operationen machen.



  • 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);
    // ...
    


  • 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.


  • Mod

    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ür char ).
    Bei der Konsolenausgabe werden char s aber eben als ASCII(bzw. die verwendete Codepage) interpretiert. Wenn Du das nicht willst könntest Du z.B. nach unsigned casten(oder gleich in unsigned 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.


Log in to reply