Verkehrte Hex Welt??



  • Hallo,

    ich habe ein Program welches mir Daten aus einer Datei ausließt konztruiert
    das funktioniert ja auch alles noch prima, aber was mache ich wenn der Wert umgekehrt gespeichert wurde

    z.B wird der Wert 100 als 64 00 00 00 gespeichert

    Jetzt habe ich aber das Problem, wenn der Wert so gespeichert wurde

    00 00 00 64 (???)

    liefert der C Builder nur Müll

    Ich habe das ganze mit FileRead(...) probiert, guckst du hier:

    void TForm1::ReadData()
    {
     unsigned int i;
    
     int h = FileOpen("C:/example.dat",fmOpenRead);
    
     // hier irgendwo liegt der Fehler, normale zahlen werden binär ausgelesen
     // aber z.B. 00 00 00 64 (100) führt zu einer ganz merkwürdigen Ansicht
     // z.B. -16726323 etc. und der Wert ist jedes mal anders
     FileRead(h,(char*) &i,sizeof(i));
    
     FileClose(h);
    }
    

    Dann habe ich probiert das ganze als String einzulesen: (geht natürlich auch nicht, da ich den Wert komplett umdrehen müsste und in int konvertieren)

    void TForm1::ReadData()
    {
     unsigned char bytes[3]; //unsigned wegen der führenden 00 Bytes
     String tmp; // temporärer string
    
     int h = FileOpen("C:/example.dat",fmOpenRead);
    
     FileRead(h,(char*) &bytes,sizeof(i));
    
     // 1 Versuch
     // geht nicht, wegen 00 Bytes, da als \0 interpretiert
     tmp.Format("%s",bytes);
    
     // 2 Versuch
     // Alles als Zeichen speichern und Bytes umdrehen, da ja als 00 00 00 64
     // gespeichert.
     tmp.Format("%c%c%c%c",bytes[3],bytes[2],bytes[1],bytes[0]);  
    
     // die Konvertierung in Integer liefert jedoch nur mist (negative) oder
     // positive Quatsch-Werte
     int i = StrToInt(tmp);
     FileClose(h);
    }
    

    Hilllfffeee, ich bin mit meinem Latein echt am Ende!!

    An den Datentypen, denke ich, kann das ganze nicht liegen, da ich ja keinen Überlauf produziere.

    Ich bin für jede Hilfe dankbar...

    Edit:
    Bitte die Code-Tags benutzen. Danke!


  • Mod

    Hallo

    zum umspeichern kannst du auch ein Union vrwenden

    Union { long, char[4]}
    ub char[0-3] soeicherst du deine werte (richtig herum !!!)
    und liesst dann deinen long(int Wert aus

    MfG
    Klaus



  • Danke für den Hinweis,

    aber es muss doch auch wie in meinem Beispiel funktionieren,
    also mit String??

    Es kann doch nicht sein, dass ich jedesmal jedes einzelne Byte umdrehen muss??

    Oder kennt jemand die Methode, warum der Wert anders als "Normal" geschrieben wird??


  • Mod

    Hallo

    die Frage ist "was ist normal"

    das einInteger zB binaer so gespeichert wird ist normal
    (schau dir mal die Grundlagen zu dem Thema an)

    MfG
    Klaus



  • Mal anderstherum gefragt, wie schreibst Du denn die '100' in die Datei ?



  • so z.B.

    int i = 100;

    // FileOpen ... blablabla
    FileWrite(h,(char*) &i,sizeof(i));

    Ausgabe in die Datei erfolgt so: 64 00 00 00

    Da die Übersetzung links ausgerichtet ist, werden alle werte so gespeichert
    Die Bitweise Übersetung verläuft meines wissens nach von rechts nach links,
    was aber bei z.B. einer Integer Zuweisung nicht der Fall ist.

    Aber das ist ja auch nicht das Problem, ich habe vielmehr das Interesse daran, wie ich den Wert wieder umdrehe.

    Ich bedanke mich jedoch trotzdem bei euch!!



  • Das Wiedereinlesen sollte eigentlich so wunderbar funktionieren (ungetestet):

    int i;
    FileRead(h, &i, sizeof(i));
    


  • Geht leider auch nicht, es wird ein falscher Wert ausgegeben.

    Trotzdem danke!



  • Hmm, also dieses kleine Testprog funktioniert bei mir wunderherrlich 🙄

    int handle;
    int i;
    
    if((handle=FileOpen("c:\\Test.dat", fmOpenWrite))>=0)
    {	i=100;
    	FileWrite(handle, &i, sizeof(i));
    	FileClose(handle);
    }
    else
    {	ShowMessage("Fehler fmOpenWrite");
    }
    
    i=0;
    
    if((handle=FileOpen("c:\\Test.dat", fmOpenRead))>=0)
    {	FileRead(handle, &i, sizeof(i));
    	FileClose(handle);
    
    	ShowMessage(i);
    }
    else
    {	ShowMessage("Fehler fmOpenRead");
    }
    


  • Bei mir klappt das ja auch, auch dein vorhergehender Beitrag!

    Leg aber mal eine Datei nach folgendem Muster an:

    z.B. Test.dat

    schreibe (mit Hexeditor oder so) 64000000 (hex angabe) und speichere.

    Jetzt probier mal die 100 wieder auszulesen, da kommt nur Müll raus 😕



  • Hab ich gemacht, 1.Teil (fmOpenWrite) o.g. Progs auskommentiert, es kommt 100 raus ...


Anmelden zum Antworten