Wie zu zwingen PHP eine Reihe wie ein uint zu behandeln
Frage
Ich habe einige C # -Code, dass sieht wie folgt aus:
uint a = 0x9E3779B9;
a += (uint)(url[k + 0] + (url[k + 1] << 8) + (url[k + 2] << 16) + (url[k + 3] << 24));
Nach diesem Code, a == 228 452 386
Jetzt in PHP ist die Zahl nicht auf die gleiche Weise überlaufen Ich versuche, diese C # -Code zu PHP zu übersetzen, aber:
$a = 0x9E3779B9;
$a += ($url[$k+0] + ($url[$k+1] << 8) + ($url[$k+2] << 16) + ($url[$k+3] << 24));
Nach diesem Code, ein 682 == 4 523 419 $
In beiden COSES „url“ wird als eine Reihe von ASCII-Werten behandelt. Die Erträge der gleichen Ergebnisse bis zum Zeitpunkt $ a auf das Ergebnis der zweiten Zeile hinzugefügt wird. An diesem Punkt der C sprudelt # uint auf ~ 228 Millionen. PHP wird „clever“ und kommt mit der „richtigen“ Antwort auf.
Aber ich will die übergelaufenen Antwort, dass C # gibt. Was soll ich tun?
Lösung
ein $a &= 0xFFFFFFFF
Fügen Sie den Wert wieder in den 32-Bit-Bereich zu setzen, nachdem Sie die +=
getan haben.
(Siehe auch: http://www.ideone.com/6BR0U )
Andere Tipps
Es ist ein gewesen, während und eine Arbeits Antwort wurde bereits eingereicht, aber ich wollte nur einen einfacheren Weg markieren, die Auspacken auszuführen, dass Sie tun:
$a = 0x9e3779b9;
$url = 'info';
$a = ($a + current(unpack('L', $url))) & 0xffffffff;
printf("%u\n", $a); // 228452387
Ich bin mit unpack()
die Umwandlung von binär zu uint32 (Maschine-Byte-Reihenfolge) auszuführen. Auf 32-Bit-Plattformen kann das End-Ergebnis negativ werden, weshalb ich bin auch mit printf()
richtig formatiert das Ergebnis aus.