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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top