Einlesen von Hex aus String
-
Hallo allerseits
Ich bastel gerade einen Hex Editor.
So der Inhalt des Savegames wird in einem String gespeichertJetzt 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 klapptb = 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 behobenEr 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. 03int 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);
-
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