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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top