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?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top