Cómo forzar PHP para tratar una serie como un uint
Pregunta
Tengo algo de código C # que es similar al siguiente:
uint a = 0x9E3779B9;
a += (uint)(url[k + 0] + (url[k + 1] << 8) + (url[k + 2] << 16) + (url[k + 3] << 24));
Después de ese código, a == 228 452 386
Ahora estoy tratando de traducir el código C # para PHP, pero en PHP el número no se desborde la misma manera:
$a = 0x9E3779B9;
$a += ($url[$k+0] + ($url[$k+1] << 8) + ($url[$k+2] << 16) + ($url[$k+3] << 24));
Después de ese código, $ a == 4 523 419 682
En tanto coses "URL" se trata como una matriz de valores ASCII. Las declaraciones de los mismos resultados hasta el momento $ a se añade al resultado de la segunda línea. En ese punto, el C # uint desborda a ~ 228 millones. PHP se "inteligente" y se le ocurre la respuesta "correcta".
Pero yo quiero la respuesta desbordada que C # da. ¿Qué debo hacer?
Solución
Añadir un $a &= 0xFFFFFFFF
para poner la parte trasera valor en el rango de 32 bits después de haber realizado la +=
.
(Véase: http://www.ideone.com/6BR0U )
Otros consejos
Ha sido un tiempo y una respuesta de trabajo ya se ha presentado, pero yo sólo quería poner de relieve una manera más fácil para realizar el desembalaje de que estás haciendo:
$a = 0x9e3779b9;
$url = 'info';
$a = ($a + current(unpack('L', $url))) & 0xffffffff;
printf("%u\n", $a); // 228452387
Estoy usando unpack()
para realizar la conversión de binario a uint32 (orden de bytes de máquina). En las plataformas de 32 bits, el resultado final puede ser negativo, por lo que también estoy usando printf()
adecuadamente formatear el resultado.