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



  • Hallo zusammen

    Ich arbeite hauptberuflich als Webdesigner, somit konnte ich über die 3 Jahre etwas an Erfahrungen in (PHP/JS/NODEJS/CSS/MYSQL) zusammen sammeln. Als ich mich etwas näher mit c++ befasste wurde mir auf gut deutsch gesagt einen Stein an den Kopf geworfen. 😉

    Jetzt hänge ich an einem Problem und wollte einmal in die Runde fragen ob es möglicherweise eine aqaquate Lösung für mein Problem gibt.

    Vorerst muss man verstehen was mein Ziel ist:

    1. Der Benutzer wird aufgefordert seine HP zu definieren.

    int HpMenge;
    cout << "Wie viel HP hat dein Charakter: " << endl;
    cin >> HpMenge;
    

    2. Diese eingegebene Dezimal Zahl sollte in einen 4bytes Wert konventiert werden. Grund dafür ist:

    if (valueHP == 1218142148) // 1218142148 Das ist der 4 byte Wert von der eingegebenen HP, bzw wurde dies natürlich manuel eingetragen, da es ansonst die HpMenge wäre...
    				{
    					clog << "Treffer! Die Dynamische HP adresse wurde gefunden!" << AdressSearcherHP << endl;
    					clog << "Dieser adresse hat den Wert: " << valueHP << endl;
    					clog << "Es wurden: " << ScanCountHP << " scanns durchgeführt!" << endl;
    					/*FoundCounter++;
    					if (FoundCounter >= 3)
    					{
    					break;
    					}*/
    					break;
    				}
    

    ValueHp = Der gleiche Wert wie 1218...

    Dies ist zwar nicht viel Code, da ich meine Idee aber nicht Preisgeben möchte hoffe ich Ihr könnt nachvollziehen was ich erreichen möchte.

    Kurzfassung: cin >> HpMenge; Das einzige was ich möchte ist das die HpMenge die von User bestimmt wird direkt in 4bytes angezeigt wird.
    Leider ist es nicht möglicht DWORD HpMenge zu benutzen, es würde ja lediglich die eingegeben Zahl in DWORD speichern stat in Int.

    Frage: Gibt es eine Formel um eine Dezimalzahl in 4 bytes zu Rechnen, falls ja bitte eine gute Beschreibung dazu.

    Ich bedanke mich schon einmal für eure Ideen und wünsche allen einen schönen Sontag.

    Gruss Ivorysmoker



  • Ich rate jetzt einfach mal:
    Du willst eine Eingabe wie 1218142148 in vier Zahlen, die jeweils ein Byte haben, unterteilen?



  • Hmm, ich möchte eig nur ein Dez Wert z.b 316000 in 4 bytes umrechnen.
    Somit wäre das Resultat: 121....

    Ich habe das in Cheat Engine gesehen bsp.

    Suche nach einem Float wert, stelle den gefunden Float wert von Float auf 4 bytes voila. Genau das will ich erreichen.

    Bsp:

    Life Wert: 318206.125
    4 Byte davon ist: 1218142148

    Wie man das genau anstellt will ich wissen. Bin leider kein Math Genie 😛

    Gruss Ivorysmoker



  • Inwiefern ergibt 316000 121...?
    Ich frag mal auf einer anderen Ebene:
    Wieso denkst du, dass du diesen komischen 4Byte-Wert brauchst.



  • 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