Einlesen von Hex aus String



  • Hallo allerseits

    Ich bastel gerade einen Hex Editor.
    So der Inhalt des Savegames wird in einem String gespeichert

    Jetzt versuch ich eine bestimmte Zahl(Gesundheit), die falschrum ins Savegame geschrieben wird, einzulesen
    die Zahl ist 03E8 (1000), in Savegame steht also E803
    so das Stück Code.
    Ich hab die Zahl als String gespeichert und wollte ihn in einer MessageBox anzeigen, um zu schauen ob alles klappt

    b = read(a+1);
    c = read(a);

    sprintf(buffer, "%x%x", b, c);

    MessageBox(NULL,buffer,"",NULL);

    a ist die Position des "03" und a+1 von "E8"

    jetzt zeigt es aber nicht an
    "03E8"
    sondern "03FFFFFFFFFFFFFFFFFFFE8" und das Programm stürzt (beim Beenden) ab und es kommt der Windoof Fehler
    "Das Programm hat ein Problem festgestellt..."
    und
    "Fehler in Anwendung"
    Die Anweisung ... verweist auf Speicher in "0xFFFFFFFFFFFFFFFFFE8" der Vorgang "read" konnte nicht auf dem Speicher ausgeführt werden.

    Andere Werte einzulesen/zu schreiben funzt super
    Bitte um Hilfe 😉



  • Da schreibst wohl du an die falsche stelle und nicht windows ist doof.



  • Warum? Wo solls denn sonst hin?
    Hat weder primär was mit MFC noch WinAPI zu tun, nix mit der Konsole, nix mit Spieleprogrammierung...



  • Hallo

    rabbbarbär meint nicht das du im falschen Forum postest, sondern entweder deinen Wert in der Datei an der falschen Stelle suchst oder/und ein ganz anderes Speicherproblem hast. Was genau könenn wir aber mangels relevanten Quellcode nicht sagen. Tip : benutze deinen Debugger und geh Schritt für Schritt durch.

    bis bald
    akari



  • achso lol :p sorry
    Also die Fehlermeldung ist behoben

    Er sagt aber immer noch statt E8 FFFFFFFE8
    Habs leicht umgeschrieben, dass keine anderen Funktionen verwendet werden
    außer get_string_pos, der sucht einfach den String "NJONS" 🙂
    Die Position stimmt, wenn ich mit nem Hex Editor nachschaue steht da auch der Wert E8 bzw. 03

    int pos = get_string_pos("NJONS");
    pos -= 14;

    char* buffer = new char[64];

    int b;
    int c;

    b = m_text[pos+1];
    c = m_text[pos];

    sprintf(buffer, "%x%x", b, c);

    MessageBox(NULL,buffer,"",NULL);


  • Mod

    char ist bei deinem compiler wohl vorzeichenbehaftet.



  • Zur Erklärung:
    char(0xE8) ist, falls der Typ 8 Bit vorzeichenbehaftet ist (-128...+127), -24.
    Dh, in der folgenden Zeile:

    c = m_text[pos];
    

    wird c der Wert -24 zugewiesen. Es wird also nicht bitweise, sondern arithmetisch kopiert. Und -24 wird in einem 32 Bit int intern mit dem Wert 0xFFFFFFE8 gespeichert. Und genau das wird auch ausgegeben. Einfache Lösung des Problems ➡ verwende unsigned Typen!

    btw:

    a ist die Position des "03" und a+1 von "E8"

    Das dürfte unter Windows genau andersrum sein.



  • Vielen Dank funktioniert super

    Neues Problem, genau anders rum
    Ich hab eine Zahl, muss sie zerlegen und anders rum im String speichern
    also z.B. 1512(0x05E8) wird eingegeben, dann muss es in 5 und E8 zerlegt und dann gespeichert werden als E805



  • Ganz kann ich dir nicht folgen was du in welche Richtung umwandeln willst.
    Auf jeden Fall kannst du dir die ganze Byte-dreherei sparen.

    #include <sstream>
    #include <iostream>
    #include <fstream>
    #include <iomanip>
    
    using namespace std;
    
    int main() {
       short int si = 1512;
    
       cout << "writing " << si << " to file\n";
    
       ofstream fo("a.dat",ios::out | ios::binary );
       fo.write((char *)& si, sizeof(si) );
       fo.close();
    
       ifstream fi("a.dat", ios::in | ios::binary );
    
       fi.read((char*)&si, sizeof(si) );
    
       cout << hex << setfill('0') << setw(4) << si << " = " << dec << si << endl;
       fi.close();
    
       // oder umgekehrt von hex-string 
    
       stringstream str( "05e9" );
    
       cout << "writing " << str.str() << " to file\n";
    
       str >> hex >> si;
    
       fo.open("a.dat",ios::out | ios::binary );
       fo.write((char *)& si, sizeof(si) );
       fo.close();
    
       fi.open("a.dat", ios::in | ios::binary );
    
       fi.read((char*)&si, sizeof(si) );
    
       cout << hex << setfill('0') << setw(4) << si << " = " << dec << si << endl;
       fi.close();
    
       return 0;
    }
    

    Kurt


Anmelden zum Antworten