Binäre Datei (Spielstand) auslesen und Werte anzeigen
-
Hallo,
ich habe bisher in MFC nur mit Textdateien gearbeitet, was ziemlich liecht und verständlich war. Nun versuche eine Art Spielstand-Editor zu schreiben und habe da das Problem daß ich nicht weiß wie ich die Werte am einfachsten aus der Datei bekomme.
Beispiel:
Ich weiß daß an Offset X z.b. mein Geldbetrag steht (4 bytes). Dieser Geldbetrag wurde nun "rückwwärts" in die Datei geschrieben also z.B. 1 Million Geld = 000F4240h wird als 40420F00 in die Datei geschrieben. Ein anderer Wert benötigt jedoch nur 2 bytes , z.b. 1000 = 03E8h wird als E803 in die Datei geschrieben.
Meine Frage ist nun wie ich sowas am einfachsten mache. Ich denke es gibt da sicher eine Möglichkeit diese Werte wieder "Rückwärts" auszulesen und gleich in einen int/int64 zu wandlen ?!
Vielen Dank im vorraus
Heiko
-
Bau dir doch einfach ein stück code.. so in der richtung:
template<class datatype> datatype read_in(unsigned char *pBuffer) { datatype result; unsigned char *pVal = (unsigned char*)&result+sizeof(datatype); for(int i=0;i<sizeof(datatype);i++) *--pVal = *(pBuffer+i); return result; }
-
Hi Cmatt,
vielen Dank für die schnelle Antwort, leider habe ich wohl nicht sooo die Kenntnisse um zu verstehen wie das genau geht.
Dem read_in übergebe ich dann meinen Pointer auf den 4byte großen Puffer in dem meine hexzahl noch als char drinsteht ?!
Falls ja WO muß ich den dieses template definieren

Much thx
heiko
-
Das template liest aus nem übergeben buffer, swapt die bytes und stopf sie in deinen datenyp.
Bsp:
unsigned char *pBuffer = new ... //.. fülle denn buffer / lese aus dem file // ein long (4 bytes) liegft auf offset 0x10 // verwende das template um es aus dem buffer zu lesen: long myLong = read_in<long>(pBuffer+0x10); // ein short (2 bytes) liegft auf offset 0x20) // verwende das template um es aus dem buffer zu lesen: short myShort = read_in<short>(pBuffer+0x20);
-
Hi Cmatt,
habe das jetzt mal implementiert, jedoch dreht er die Zahlen nicht um:Habe ei short in der Datei stehen 5C 50 , das sollte er dan umdrehen zu 50 5C und in int wandeln, heraus kommt leider 23632 statt 20572, also nicht umgedreht.
Ist das mein Fehler , rufe ich da was flasch auf ?
Thx
Heiko
-
ermmm...
1. 0x5C 0x50 in ein int umwandel ist keine gute idee, da ein int bei dir höchst warscheinlich 4 byte sind, nimm lieber ein short oder __int16

2. Wenn in deinem memory-dump ... 0x5C 0x50 ... steht und das ganze 0x505c sein soll brauchst doch gar nix umzuwandlen

Intel, AMD & co. == Little Endian CPUs, die speichern die zahlen verkehrt rum, mein template bräuchtest du also nur auf nem MAC (Big Endian CPUs), auf nem PC ist so was genug:// im buffer steht 0x5C, 0x50 unsigned char buffer[] = {0x5C, 0x50 }; // steck das ganze in ein short short *s = (short*)test; // in *s steht nun 0x505Cund damit wir das ganze Platform unabhängig haben, erweitern wir das template:
template<class datatype> datatype read_in(unsigned char *pBuffer) { #ifdef _PC datatype *result = (datatype*)pBuffer; return *result; #else #ifdef _MAC datatype result; unsigned char *pVal = (unsigned char*)&result+sizeof(datatype); for(int i=0;i<sizeof(datatype);i++) *--pVal = *(pBuffer+i); return result; #else #error "No CPU-Type defined! (define _PC or _MAC)" #endif // _MAC #endif // _PC }jetzt musst nur mehr _MAC oder _PC definieren und kannst immer über dieses template lesen, egal auf welchen syste, du grad bist
