Binär lesen



  • Hi!
    Ich versuche wieder einmal, eine Datei auszulesen und mache wieder lauter vermutlich dumme Fehler, aber ich komme nicht darauf, was falsch ist:
    Zunächst: Die Datei: Ich habe sie im Hexeditor einmal angeschaut, laut Hexeditor sind einmal 42 + 55 + 64 Byte "Vorspann", den ich nicht brauche und dann kommen immer 4 byte, die eine float zahl sind.
    mein code sieht folgendermaßen aus:

    Reader.open(fullfilename.c_str());
     if(!Reader) cout << "could not open Reader" << endl;
    
     char bisaso[42];
     Reader.read(bisaso,42);
    
     char Leerzeichen[52];
     Reader.read(Leerzeichen,52);
    
     char Dimensions[64];
     Reader.read(Dimensions,64);
    
     char buffer[4];
     char Buffer1[4];
     //lese erste Zahl
     Reader.read(buffer,4);
     for(int i=0; i<3; i++) buffer[i] = Buffer1[3-i];
     float* f= reinterpret_cast<float*>(Buffer1);
     cout << *f << endl;
     //lese noch eine Zahl
     Reader.read(buffer,4);
     for(int i=0; i<3; i++) buffer[i] = Buffer1[3-i];
     f= reinterpret_cast<float*>(Buffer1);
     cout << *f << endl;
     Reader.close();
    

    Die Ausgabe sieht folgendermaßen aus:
    -1.07374e+008
    -1.07374e+008

    Was 1) nicht stimmt, laut Hexeditor sollte da eine andere Zahl stehen
    und 2) liest er, wenn ich eine Schleife darüber lege, immer dieselbe Zahl aus, und das ist sicherlich nicht korrekt.

    Wenn jemand einen Tipp für mich hätte, wäre ich ihm sehr dankbar!
    lg,
    Iso



  • ... 42 + 55 + 64 ...

    In deinem Code steht 52.

    for(int i=0; i<3; i++)
    

    Du willst hier anscheinend den Speicher "drehen". i < 4 wäre aber richtig.


  • Administrator

    Der beste Fehler ist aber immer noch der hier:

    Reader.read(buffer,4); 
     for(int i=0; i<3; i++) buffer[i] = Buffer1[3-i]; 
     float* f= reinterpret_cast<float*>(Buffer1);
    

    Schau dir mal die Zuweisung ganz genau an. In welchen Puffer liest du ein und wohin schreibst du die Werte? Deshalb gibt es auch immer den gleichen Wert.

    😃

    Grüssli



  • Wäre std::reverse hier nicht eh etwas simpler?
    Statt reinterpret_cast würde ich hier auch ein union verwenden, mag aber daran liegen das ich einfach unions mag. 😃



  • Hi,

    Darf ich Fragen um was für einen Typ oder Klasse es sich bei dem Reader Handelt.

    Ich muss eine Image-Datei im FAT16/Fat32/NTFS format auslesen und weis einfach keinen Ansatz.
    Das würde mir aber super helfen.

    Danke Tarantel



  • ifstream aus <fstream>



  • Danke


Anmelden zum Antworten