Comment forcer PHP pour traiter un certain nombre comme un uint
Question
J'ai un peu de code C # qui ressemble à ceci:
uint a = 0x9E3779B9;
a += (uint)(url[k + 0] + (url[k + 1] << 8) + (url[k + 2] << 16) + (url[k + 3] << 24));
Après que le code, un 228 452 386 ==
Maintenant, je suis en train de traduire ce code C # pour PHP, mais en PHP le nombre ne déborde pas de la même façon:
$a = 0x9E3779B9;
$a += ($url[$k+0] + ($url[$k+1] << 8) + ($url[$k+2] << 16) + ($url[$k+3] << 24));
Après ce code, $ a 4 == 523 419 682
Dans les deux COSES « url » est traitée comme un tableau de valeurs ascii. Les rendements les mêmes résultats jusqu'au moment $ a est ajouté au résultat de la deuxième ligne. A ce moment, le C # uint à ~ déborde de 228 millions. PHP devient « intelligent » et vient avec la « bonne » réponse.
Mais je veux la réponse que débordés C # donne. Que dois-je faire?
La solution
Ajouter un $a &= 0xFFFFFFFF
à remettre la valeur dans la gamme 32 bits une fois que vous avez fait le +=
.
(Voir: http://www.ideone.com/6BR0U )
Autres conseils
Il a été un certain temps et une réponse de travail a déjà été présenté, mais je voulais simplement souligner un moyen plus facile d'effectuer le déballage que vous faites:
$a = 0x9e3779b9;
$url = 'info';
$a = ($a + current(unpack('L', $url))) & 0xffffffff;
printf("%u\n", $a); // 228452387
J'utilise unpack()
pour effectuer la conversion de binaire en uint32 (machine de l'ordre des octets). le résultat final peut sur les plates-formes 32 bits, devenu négatif, ce qui est la raison pour laquelle je suis également en utilisant printf()
correctement formater le résultat.