Ok, so PHP ist nicht die beste Sprache für den Umgang mit beliebig großen Ganzzahlen in, wenn man bedenkt, dass es nur nativ unterstützt 32-Bit signierte Ganzzahlen. Was ich versuche zu tun, obwohl ist eine Klasse zu erstellen, die eine beliebig große Binärzahl darstellen könnte und in der Lage, einfache arithmetische Operationen auf zwei von ihnen (addieren/Subtrahieren/Multiplizieren/Dividieren) durchzuführen.
Mein Ziel ist der Umgang mit 128-Bit-Ganzzahlen.
Es gibt mehrere Ansätze, die ich in Betracht ziehe, und ich sehe Probleme mit ihnen. Jede Anregung oder jeder Kommentar dazu, was Sie wählen würden und wie Sie dabei vorgehen würden, wäre sehr willkommen.
Ansatz #1: Erstellen Sie eine 128-Bit-Ganzzahlklasse, die ihre Ganzzahl intern als vier 32-Bit-Ganzzahlen speichert. Das einzige Problem bei diesem Ansatz ist, dass ich nicht sicher bin, wie man mit Über- und Unterlaufproblemen umgeht, wenn man einzelne Teile der beiden Operanden manipuliert.
Ansatz #2: Verwenden Sie die bcmath-Erweiterung, da sie für diese Aufgabe konzipiert wurde. Meine einzige Sorge bei diesem Ansatz ist die Skaleneinstellung der bcmath-Erweiterung, da es bei meinen 128-Bit-Ganzzahlen keine Rundungsfehler geben darf; sie müssen präzise sein. Ich mache mir auch Sorgen darüber, ob ich das Ergebnis der bcmath-Funktionen in eine binäre Zeichenkette umwandeln kann (die ich später in einige mcrypt-Verschlüsselungsfunktionen einfügen muss).
Ansatz #3: Speichern Sie die Zahlen als binäre Zeichenketten (wahrscheinlich zuerst das LSB). Theoretisch sollte ich in der Lage sein, ganze Zahlen beliebiger Größe auf diese Weise zu speichern. Alles, was ich tun müsste, ist, die vier grundlegenden arithmetischen Funktionen zu schreiben, um zwei binäre Zeichenfolgen zu addieren/sub/mult/divieren und ein binäres Zeichenfolgenergebnis zu erzeugen. Das ist genau das Format, das ich auch an mcrypt übergeben muss, das ist also ein zusätzliches Plus. Das ist der Ansatz, der meiner Meinung nach im Moment am vielversprechendsten ist, aber der einzige Knackpunkt ist, dass PHP mir keine Möglichkeit bietet, die einzelnen Bits zu manipulieren (soweit ich weiß). Ich glaube, ich müsste sie in bytegroße Stücke aufteilen (kein Wortspiel beabsichtigt), wobei meine Fragen zum Umgang mit Über- und Unterlauf aus Ansatz 1 zutreffen.