Binär Datei - Zahlenwerte genau auslesen



  • Wie kann ich aus einer "Binärdatei" die Zahlenwerte genau auslesen. Schätzungsweise ich habe erste ein int (4Byte) eingelesen, und danach ein short(2Byte), wie soll ich da beim auslesen wissen, das mal 4Byte und dann mal 2Byte eingelesen wurden, schätzungsweise ich bin n Fremder.
    Bsp:

    #include <iostream>
    #include <fstream>
    #include <string>
    using namespace std;
    
    int main()
    {
    
        int var1=982376;
        short var2=1123;
        ofstream file("H:/test.andi", ios::out | ios::binary | ios::trunc);
        file.write(reinterpret_cast<char*>(&var1),sizeof(var1));
        file.write(reinterpret_cast<char*>(&var2),sizeof(var2));
        close();
    
        ifstream FILE("H:/test.andi", ios::in | ios::binary);
        while(1)
        {
            int buffer;
            if(!FILE) break;
            FILE.read(reinterpret_cast<char*>(&buffer), sizeof(buffer));
            cout << buffer << "\n";
        }
    
    	return 0;
    }
    

    So ists falsch, aber wie weiß ich ob da 4Byte eingelesen wurden oder 2....gibts da eine Möglichkeit?
    Und was genau passiert hier, die erste Zahl der Ausgabe stimmt ja noch:

    AUSGABE:

    982376
    918627

    Kann mir jemand zu dem Thema bissel was erklären? Feinheiten etc. hab glaub irgendwie nur so oberflächliches Wissen.

    MfG
    Stromberg



  • Es gibt keine Möglichkeit, nachträglich zweifelsfrei herauszufinden, wie die Daten einer Binärdatei unbekannten Formates zu interpretieren sind.



  • Höchstens, wenn ich z.B. immer mit 4 Byte einlese, oder immer mit 2 Byte......
    dann gehts ja!?
    MfG
    Stromberg



  • Dann ist das Format ja bekannt 🙂



  • Hi Stromberg,

    du wolltest wissen, wie die Ausgabe zustande kommt:

    982376
    918627

    Du hast scheinbar einen Rechner, der seine Zahlen als Little Endian verwaltet:
    http://de.wikipedia.org/wiki/Little_Endian
    982376 -> 68 FD 0E 00
    Danach ließt dein read-Befehl nur noch 2 Bytes (überprüf mal den Rückgabewert von read 😉 )
    1123 -> 63 04

    Die anderen 2 Bytes behalten ihren Inhalt:
    63 04 0E 00 -> 918627

    Gruß,
    CSpille


Anmelden zum Antworten