2010-11-07 19 views
3

J'ai un code C# qui ressemble à ceci:Comment forcer PHP pour traiter un certain nombre comme un uint

uint a = 0x9E3779B9; 
a += (uint)(url[k + 0] + (url[k + 1] << 8) + (url[k + 2] << 16) + (url[k + 3] << 24)); 

Après ce 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 cas, "url" est traité comme un tableau de valeurs ascii. La fonction renvoie les mêmes résultats jusqu'au moment où $ a est ajouté au résultat de la deuxième ligne. À ce stade, le C# uint déborde à ~ 228 millions. PHP devient "intelligent" et arrive avec la "bonne" réponse. Mais je veux la réponse débordée que donne C#. Que devrais-je faire?

Répondre

0

Il a été un certain temps et une réponse de travail a déjà été soumis, 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 (ordre des octets machine). Sur les plates-formes 32 bits, le résultat final peut devenir négatif, c'est pourquoi j'utilise également printf() pour formater correctement le résultat.