Convertierung von einer (Dezimalzahl/int) zu 4 bytes, benötige hilfe (kaum Erfahrungen in c++)



  • In meinen Augen gibt es 2 möglichkeiten um mein Problem zu lösen, entweder wandle ich den eingegebenen Dez Wert des Users in den gleichen Typ um wie ich auslese (Typ DWORD).

    Oder ich lese direkt nur Floats aus, da liegt aber noch die Schwirigkeit. Daher meine Idee mit dem Unwandeln.

    Wenn ich in Cheat Engine den Wert 318206.125 als typ Float habe und dies dan umstelle auf 4 bytes ergibt dies den Wert: 1218142148

    Mit dem Wert 1218142148 kann ich dan arbeiten.

    Leider ist mir noch nicht bekannt wie ich nur nach dem Typ Float mit readmemoryprocess suchen kann.

    ReadProcessMemory(handle, (LPCVOID)("%X", AdressSearcherHP), &valueHP, sizeof(DWORD), &numBytesRead);
    			if (GetLastError()){
    				clog << "Diese Adresse gibt es nicht!" << endl;
    			}
    

    Value HP gibt mir eben diesen 4 bytes Wert, da der User aber ein Dezimal Wert eingegeben hat, würde es nimals den richtigen Eintrag finden.

    Daher muss ich entweder direkt nach Floats suchen was iwie nicht so richtig funktioniert oder eben den Dez Wert umrechnen.

    Ich hoffe ich konnte dirs in etwas schildern.

    Gruss Ivorysmoker



  • ivorysmoker schrieb:

    In meinen Augen gibt es 2 möglichkeiten um mein Problem zu lösen, entweder wandle ich den eingegebenen Dez Wert des Users in den gleichen Typ um wie ich auslese (Typ DWORD).

    DWORD ist nichts anderes als unsigned int.

    Wenn ich in Cheat Engine den Wert 318206.125 als typ Float habe und dies dan umstelle auf 4 bytes ergibt dies den Wert: 1218142148

    Ja, weil floats intern im IEEE754 Format dargestellt werden, was das als Exponent und Mantisse darstellt.

    Leider ist mir noch nicht bekannt wie ich nur nach dem Typ Float mit readmemoryprocess suchen kann.

    ReadProcessMemory(handle, (LPCVOID)("%X", AdressSearcherHP), &valueHP, sizeof(DWORD), &numBytesRead);
    			if (GetLastError()){
    				clog << "Diese Adresse gibt es nicht!" << endl;
    			}
    

    Der Code macht iwie keinen Sinn.

    Value HP gibt mir eben diesen 4 bytes Wert, da der User aber ein Dezimal Wert eingegeben hat, würde es nimals den richtigen Eintrag finden.

    Las den User doch ein float eingeben.



  • Hallo,

    das geht mit einem Cast:

    float x = 318206.125;
    int y = *reinterpret_cast<int*>(&x);
    

    s. http://ideone.com/Qem1Dg

    Aber mir scheint (so wie Nathan auch schon geschrieben hat), daß du den Aufruf von ReadProcessMemory nicht verstehst (insb. der 2. Parameter ergibt keinen Sinn: entferne einfach "%X" - durch den Kommaoperator wird es sowieso nicht beachtet).
    Und als Puffer kannst du die Adresse einer beliebigen Variablen (egal ob float, int oder sonst etwas) angeben.



  • DWORD ist nichts anderes als unsigned int.

    Das ist mir bereits bekannt danke 🙂

    ReadProcessMemory(handle, (LPCVOID)("%X", AdressSearcherHP), &valueHP, sizeof(DWORD), &numBytesRead);
    			if (GetLastError()){
    				clog << "Diese Adresse gibt es nicht!" << endl;
    			}
    

    [/quote]

    Der Code macht iwie keinen Sinn.

    Dies ist nur ein kleiner schnippsel von der ganzen Schleife...

    Grüsse Ivorysmoker



  • Hallo,

    das geht mit einem Cast:

    float x = 318206.125;
    int y = *reinterpret_cast<int*>(&x);
    

    s. http://ideone.com/Qem1Dg

    Aber mir scheint (so wie Nathan auch schon geschrieben hat), daß du den Aufruf von ReadProcessMemory nicht verstehst (insb. der 2. Parameter ergibt keinen Sinn: entferne einfach "%X" - durch den Kommaoperator wird es sowieso nicht beachtet).
    Und als Puffer kannst du die Adresse einer beliebigen Variablen (egal ob float, int oder sonst etwas) angeben.

    Vielen Dank, genau das:

    float x = 318206.125;
    int y = *reinterpret_cast<int*>(&x);
    

    habe ich gebraucht. Ohne das %X würde die Adresse nicht als Hex gesehen werden, somit würde es ein falsches Resultat liefern.

    Soweit funktioniert der Code wunderbar, das einzige prob war diese Umrechnung.

    Vielen Dank für die Informationen.

    Gruss Ivorysmoker



  • Ah der 2 Parameter sieht auf den ersten Blick etwas komisch aus, du musst aber wissen das dies so eine Art generator ist.

    Wenn ich mehr Code posten würde, könntest du es nachvollziehen was ich tuhe.

    Gruss Ivorysmoker



  • ivorysmoker schrieb:

    Vielen Dank, genau das:

    float x = 318206.125;
    int y = *reinterpret_cast<int*>(&x);
    

    Und wenn man es genau nimmt: Undefined Behavior, da strict aliasing verletzt wurde.

    Ohne das %X würde die Adresse nicht als Hex gesehen werden, somit würde es ein falsches Resultat liefern.

    Falsch.
    1. grundsätzliches Verstädnisproblem Darstellung: In einem int ist ein Wert gespeichert. Dieser Wert wird auf den meisten Systemen binär gespeichert. Übergibt man einen int an eine Funktion, wird der Wert übergeben. Wie dieser Wert dargestellt wird ist unerheblich, eine Funktion macht dasselbe, ob man nun 15 oder 0xF übergibt. Hexadezimal etc. ist nur für die Ausgabe relevant, nicht für eine Funktion. Denn Funktionen arbeiten mit dem Wert, nicht mit der Darstellung.
    2. Raten: Programmieren ist nicht Raten! Du musst wissen, was du machst. Nur weil %X für printf funktioniert, funktioniert das woanders nicht!

    (LPCVOID)("%X", AdressSearcherHP)
    

    Ruft den Kommaoperator mit "%X" und AdressSearcherHP, das Ergebnis ist AdressSearcherHP, was du dann noch LPCVOID castest. Das ist dasselbe wie (LPCVOID)AdressSearcherHP.


  • Mod

    Dieser Wert wird auf den meisten Systemen binär gespeichert.

    Der Standard verlangt eine binäre Darstellung.



  • Arcoth schrieb:

    Dieser Wert wird auf den meisten Systemen binär gespeichert.

    Der Standard verlangt eine binäre Darstellung.

    Auch gut. Ich hab das auch nur aus der Gewohnheit keine absoluten Aussagen zu machen, weil irgendeiner bestimmt ein Gegenbeispiel hat, heraus geschrieben.



  • 1. grundsätzliches Verstädnisproblem Darstellung: In einem int ist ein Wert gespeichert. Dieser Wert wird auf den meisten Systemen binär gespeichert. Übergibt man einen int an eine Funktion, wird der Wert übergeben. Wie dieser Wert dargestellt wird ist unerheblich, eine Funktion macht dasselbe, ob man nun 15 oder 0xF übergibt. Hexadezimal etc. ist nur für die Ausgabe relevant, nicht für eine Funktion. Denn Funktionen arbeiten mit dem Wert, nicht mit der Darstellung.

    Vielen Dank, das wusste ich nicht.

    2. Raten: Programmieren ist nicht Raten! Du musst wissen, was du machst. Nur weil %X für printf funktioniert, funktioniert das woanders nicht!

    Wenn man eine neue Sprache lernt passiert sowas schon einmal. Ich denke um zu wissen was man tut in c++ braucht man etwas länger, meine Erfahrungen beruhen in diesem Bereich knap auf 1 Woche.


Anmelden zum Antworten