PHP - Ein bisschen Code 64bit-tauglich machen [Erledigt]
-
Ich hätte gerne bald ein funktionierendes Skript.
100 Euro anyone?MfG
-
Wie Ringostarr schon sagt ist PHP nur eine Skript Sprache die vom Server Interpretiert wird. Somit ist es Aufgabe des Servers das Skript in 64bit zu verarbeiten.
Schon mal bei nem anderen Host versucht vllt. liegt es ja an den Sicherheitseinstellungen oder so.
Ansonsten glaub ich ist es besser den Thread zu schließen, ich glaub kaum das sich nach 3 Monaten noch jemand meldet.
-
Deshalb hab ich mir ja erlaubt, von Seite 2 wieder an den Anfang zu kommen.
Das Skript macht einen kurzen Datenaustausch mit einem Server, das funktioniert überall. Danach wird nur noch herumgerechnet. Und das gibt unter 64bit die falschen Werte, unter 32bit nicht.
ceplusplus@loggedoff schrieb:
Der Code nutzt anscheinend 32bit Überläufe aus und verwendet zB. "4" anstatt PHP_INT_SIZE.
-
Da ich keinen PHP Server hab der mit 64bit arbeitet, kann ich dass nicht testen. Ich kann mir aber auch nicht vorstellen das es ein Problem von 32bit zu 64bit ein Problem gibt da ja die Variablen höhere Werte annehmen können und nicht anders rum.
Wenn es wirklich das "4" statt "PHP_INT_SIZE" Problem sein sollte kannst du ja einfach mal eine "4" nach der anderen mit "PHP_INT_SIZE" ersetzen. Oder geb mal überall die Werte ausgeben um festzustellen wo genau der Fehler ist.
-
SWW13 schrieb:
Ich kann mir aber auch nicht vorstellen das es ein Problem von 32bit zu 64bit ein Problem gibt da ja die Variablen höhere Werte annehmen können und nicht anders rum.
Er hat doch geschrieben, dass der Code Überläufe ausnutzt.
-
SWW13 schrieb:
kannst du ja einfach mal eine "4" nach der anderen mit "PHP_INT_SIZE" ersetzen.
Das allein hilft leider nicht.
SWW13 schrieb:
Oder geb mal überall die Werte ausgeben um festzustellen wo genau der Fehler ist.
Etwas viele Werte... Da frage ich lieber zuerst, ob das nicht mit den Container-Klassen und den Bit-Operationen zusammenhängt...
MfG
-
Hmm..., das mit den Überläufen hab ich ganz überlesen. Dass kann gut sein, dass es mit den Bit-Operationen zusammenhängt. Wenn z.B. die Bit's bei 32bit "gedreht" werden, werden sie bei 64bit vllt nur nach vorne geschoben. Ich werds mir mal ankucken wobei ich mich bisher noch nicht sonderlich mit Bit-OOperationen beschäftigt hab.
-
Also, die "Left-Shift"(<<) Operatoren müssten an dem ganzen Schuld sein.
Ein int in PHP entspricht einer long in C/C++. Somit müsstest du bei jedem bzw. nach jedem "Left-Shift" alle Bits über 32 löschen bzw. die die Verschoben wurden.
Ich hab zwar bisher nicht sonderlich Profesionell mit PHP gearbeitet aber das ganze müsste Beispielsweiße so gehen(zmindest in C++ muss es gehen):int Test = 59995; Test = Test << 3; Test &= ~(1<<32)); //Lösche das 33 Bit(Es wird von 0 an gezählt) Test &= ~(1<<33)); Test &= ~(1<<34)); //Das müsste den gleichen Effekt haben Test &= ~(1 + 2 + 4<<32)); //Wenn 2. Funktioniert, müsstest du hiermit alle über 32bit löschen Test &= ~(4294967296<<32)); //4294967296 = 2^32
Wie gesagt ich kann das leider nicht testen. Und mit Bit Operatoren arbeite ich normal auch nicht.
-
Danke, guter Ansatz!
Habe alle left-shifts entsprechend abgeändert, zB:// 32 bit //$mask = (1 << (32 - $bits)) - 1; // 64 bit $temp1 = 1 << (32 - $bits); $temp1 &= ~(0xFFFFFFFF << 32); $mask = $temp1 - 1;
Außerdem die "4"en in Container.php durch PHP_INT_SIZE ersetzt. Auch weitere 4en in Decode.php versucht... Funktioniert leider trotzdem nicht
Falls du dich wirklich damit beschäftigen willst, kann ich dir nen temp. Account auf meinem Webspace machen. Oder ich regge mich für dich bei kilu.de.
//EDIT:
Wenn ich die 4en in Container.php NICHT ersetze, sind einige Ports schon richtig (Ein paar sind 15425..15426.. die Restlichen weiterhin Wirrwarr)! Habe aber alles mehrfach überprüft (keine Schreibfehler). Scheint aber der richtige Weg zu sein.MfG
-
Die 4rer solltest du lassen, mit dem löschen der zusätzlichen Bits simulierst du ja nen 32 Bit Integer. Es kann auch sein, das es bei irrgendwelchen Rechungen zu einem gewollten Überlauf kommt(bei 32bit) denn du dann auch simulieren müsstest.
Wenn du mir einen Test Account bei dir machst, bzw. einen bei kilu.de(Im sofernen die auch mit 64bit arbeiten) einen anlegst werd ich mal mein bestes versuchen.
-
Danke jedenfalls!
http://www.kilu.de
User: sww13
PW: phptest (Ändere das PW halt gleich)
-> FilemanagerHabe die aktuellen Dateien hochgeladen, es sind nun ein paar 154... Ports dabei (Aber wiegesagt immer noch viel zu wenige, richtig wäre es wenn ~95% mit 154... beginnen würden).
MfG
-
Ich habe die Decode()-Funktion nun mit konstanten Daten getestet (Vom Server bekommt man immer etwas Unterschiedliches, selbst wenn die IPs&Ports gleich sind).
Ergebnis: Nur ein kleines stückchen Code ist schuld, und zwar die while-Schleife in DecodeHelper1(). Vor dieser sind die Daten unter 32bit gleich wie unter 64bit, danach nicht mehr...
-
Thema erledigt!
Ich musste nur alle Variablen in DecodeHelper2/3() nach einem shift mit 0xFFFFFFF verANDen.
-
Dann bin ich ja jetzt Arbeitslos...xD
Wennigstens konnte ich mit dem "simulieren" eines 32bit int helfen.Noch viel Erfolg mit deinem Script,
SWW13/Bôrnì
-
Jo, danke nochmals.
MfG