Construction Set Erstellen eines Magic-Effects

E

Ehemaliger Benutzer

Gast
Guten Morgen,
im Moment versuche ich für ein Projekt Magic-Effects zu erstellen. Bekanntermaßen geht das über das CS nicht. Also versuche ich mit Hilfe dieser Webseite Magic-Effects manuell zu erstellen.
Dazu muss ich diese allerdings erst entschlüsseln.

Dummerweise komme ich nicht weiter. Es geht um die Berechnung der Base-Cost. Laut oben verlinkter Seite eine Float.
Ich habe mit dem CS ein bischen gespielt und den Magieeffekt "Mühsal" verändert um Veränderungen nachvollziehen zu können.

Ergebnis:

  • 01 00 00 C0 3F steht für 1.5000
  • 01 00 00 00 3F steht für 0.5000
  • 01 00 00 20 40 steht für 2.5000
  • 01 CD CC 4C 3F steht für 0.8000
  • 01 66 66 E6 3F steht für 1.8000
Schaut man sich die ersten beiden Werte an, müsste C0 für die 1 stehen.
Vergleicht man aber die Werte 3 und 4, merkt man, das hier anstatt C0 plötzlich E6 steht.
Ich bin mir sicher, dass die Werte irgendwie verrechnet werden müsssen, da eine einfache Umwandlung ins Dezimalsystem nicht die genannten Kosten liefert.

Ich habe folgendes probiert:

  • einfache Umwandlung 01 00 00 C0 3F in Dezimal = falscher Wert
  • Umwandlung von hinten 3F C0 00 00 01 in Dezimal = falscher Wert
  • Umwandlung von rechts nach links F3 0C 00 00 10 in Dezimal = falscher Wert
Ist in der Community unter Umständen ein Mathegenie? Oder sieht hier irgendjemand eine Logik? Ich gehe jeder Idee nach, und mag sie noch so sinnlos sein. Ich poste auch gerne noch mehr Vergleichswerte.
 
Zuletzt bearbeitet von einem Moderator:
Hallo Dice,

würde es dir was ausmachen noch ein paar Werte zu posten, zB. die codes von 1, 2 und 3?
 
Gerne, muss nur weitere erstellen. Die kommen dann im Verlauf des Tages.
Nur verstehe ich nicht, was für Codes Du meinst.

Die stehen im ersten Post
Der Hexcode 01 00 00 C0 3F sagt dem CS, dass die Basis-Kosten 1.5000 betragen, der Hexcode 01 00 00 00 3F steht für 0.5000 und so weiter.

Falls Du was anderes meinst, klär mich auf.;)
 
Ich meinte die Hexcodes für die Basiskosten 1.0000, 2.0000 und 3.0000, da es mit der momentanen Anzahl von Werten relativ schwierig ist, den "code zu entschlüsseln".

Ich hoffe jetzt ist klar, was ich meinte. ;)
 
du hast einen fehler gemacht. Kein Datentyp ist 5 Bytes groß.

Float sind 4 Bytes

und dann gilt:


* 0x3F C0 00 00 == 1.5000
* 0x3F 00 00 00 == 0.5000
* 0x40 20 00 00 == 2.5000
* 0x3F 4C CC CD == 0.8000
* 0x3F E6 66 66 == 1.8000

also 01 ist falsch ;)


Mfg

PS: im Anhang ist ein kleiner umrechner. !Achtung, wirklich "," verwenden nicht "."

float to HEX
 
Zuletzt bearbeitet:
  • Like
Reaktionen: 1 Person
So, also hier mal bisschen detailliert:
Der Aufbau von Fliesskommazahlen im Computer ist relativ ausgeklügelt gestaltet worden. Grundsätzlich besteht ein single (float) aus 4 Bytes und ein double (double) aus 8 Bytes.

In unserem Fall haben wir es mit floats zu tun, also 4 Bytes. Wie sind diese 32 Bit nun aufgebaut?

23 Bit Mantisse
8 Bit Exponent
1 Bit Vorzeichen

Wir machen das mal am Beispiel 1.5 durch. Wichtig ist hierbei, dass wir 1.5 zuerst in das binäre System umrechnen müssen. Das ist aber ganz einfach. Man nimmt die Zahl, schaut ob sie grösser/gleich als 1 ist. Wenn ja, notiert man sich eine 1, wenn nicht eine 0. Anschliessend zieht man die notierte Zahl (0 oder 1) ab und rechnet mal 2. Dann mit der neuen Zahl das gleiche bis man 0 erreicht. Bei uns:

1.5 >= 1 -> 1
1.5 - 1 = 0.5
0.5 * 2 = 1

1 >= 1 -> 1
1 - 1 = 0
Fertig!

Damit wäre die binäre Darstellung von 1.5 also 1.1.

Ok, das ist jetzt ein sehr schöner Fall. Es hätte zum Beispiel auch 0.00001 sein können im binären. Dann käme der Exponent ins Spiel. Vorne muss immer eine 1 stehen und nie mehr als 1 Zahl. In dem Fall oben wäre der Exponent -5. Denn 1 * 2^-5 (beachte, wir sind jetzt im binären) ist 0.00001. Hätten wir 10011.11 wäre der Exponent logischerweise 5, denn 1.001111 * 2^5 ist 10011.11.

Aus der Forderung, dass vorne immer eine 1 stehen muss lässt man die in der Mantisse weg. Also wäre unsere Mantisse 10000000000000000000000 (bei 10011.11 wäre es 00111100000000000000000).

Um den Wertebereich zu erhöhen wird der Exponent so gewählt, dass die folgende Gleichung den korrekten Wert ergibt:
2^(exponent - 127)

Wir haben Exponent 0, daher muss exponent bei uns 127 sein.

Jetzt haben wir alles:
Signum: 0
Exponent: 01111111 (= binär für 127)
Mantisse: 10000000000000000000000

Setzen wir das nun zusammen:
00111111110000000000000000000000

Das geben wir nun in den Taschenrecher im binären Modus ein und wählen umrechnen in Hexadezimal:
0x3FC00000

Und in dem Programm das Xaser gepostet hat habe ich folgendes getan:
float value = eingegebener wert;
unsigned int hexa = *(unsigned int*)&value;
textBox2->Text = hexa.ToString("X");

Er hat da noch geschrieben, man solle , verwenden und nicht . Das stimmt nicht, es ist umgekehrt, . ist das Trennzeichen und , geht nicht.

Gruss
Cromon
 
  • Like
Reaktionen: 1 Person
Hmpf...
Da benötigt man ein Mal Floats und schon hat man den Salat.
Erst mal danke für den Hinweis mit der falschen Bytezahl. Bringt natürlich minimale Änderungen mit sich.:lol:

Der zweite Fehler war, zu erwarten, dass ich die Hexwerte ins Dezimalsystem umwandle und automatisch eine Float erhalte.:headwall:

Mit den verschiedensten Umwandlern im Web liefs immer ohne Probleme(bloß bringen die mir hier nix).

@Xaser: Dein Prog tut bei mir nicht. "...Side-by-Side-Konfiguration ungültig..."
Aber ist ja auch egal. Nachdem die zwei Fehler ausgemerzt sind, habe ich mir meinen eigenen Converter geschrieben.

Und Cromon: Danke für den ausführlichen Text. Den führe ich mir dann mal zu Gemüte.