Hace algunos años, mi servidor web cambió de 32 bits a 64 bits, y un script PHP crítico dejó de funcionar. Fue debido a que las operaciones < < y >> (cambio de bit) han cambiado. Yo era capaz de solucionar mi problema mediante la sustitución de las rutinas rotateleft y rotateright con rotateleft32 y rotateright32 así:Conversión de funciones complejas de Giro PHP para trabajar en 64-bit
function rotateleft($value, $numleft) {
return (($value << $numleft) | ($value >> (32-$numleft)));
}
function rotateleft32($value, $numleft) {
return ((($value << $numleft) | ($value >> (32-$numleft))) & 0xFFFFFFFF);
}
function rotateright($value, $numright) {
return (($value >> $numright) | ($value << (32-$numright)));
}
function rotateright32($value, $numright) {
return ((($value >> $numright) | ($value << (32-$numright))) & 0xFFFFFFFF);
}
Ahora he encontrado con un nuevo conjunto de código que parece ser exactamente el mismo problema, pero es más complicado:
function ECC_RotateLeft($a)
{
$copya = makecopy($a);
$bit = ($copya->e[0] & ECC_UPRBIT) ? 1 : 0;
/* looped
for ($i = 0; $i < ECC_MAXLONG - 1; $i++)
$copya->e[$i] = ($copya->e[$i] << 1) | (($copya->e[$i + 1] & ECC_MSB) ? 1 : 0);
$copya->e[0] &= ECC_UPRMASK;
looped */
/* unlooped */
// These lines are optimized for ECC_MAXLONG==4 only!
$bit = ($copya->e[0] & ECC_UPRBIT) ? 1 : 0;
$copya->e[0] = (($copya->e[0] << 1) & ECC_UPRMASK) | (($copya->e[1] & ECC_MSB) ? 1 : 0);
$copya->e[1] = ($copya->e[1] << 1) | (($copya->e[2] & ECC_MSB) ? 1 : 0);
$copya->e[2] = ($copya->e[2] << 1) | (($copya->e[3] & ECC_MSB) ? 1 : 0);
/* unlooped */
$copya->e[3] = ($copya->e[3] << 1) | $bit;
return $copya;
}
function ECC_RotateRight($a)
{
$copya = makecopy($a);
$bit = ($copya->e[ECC_NUMWORD] & 1) ? ECC_UPRBIT : 0;
/* looped
for ($i = ECC_MAXLONG - 1; $i > 0; $i--)
$copya->e[$i] = (($copya->e[$i] >> 1) & 0x7FFFFFFF) | (($copya->e[$i - 1] & 1) ? ECC_MSB : 0);
looped */
/* unlooped */
// Thes lines are optimized for ECC_MAXLONG==4 only!
$copya->e[3] = (($copya->e[3] >> 1) & 0x7FFFFFFF) | (($copya->e[2] & 1) ? ECC_MSB : 0);
$copya->e[2] = (($copya->e[2] >> 1) & 0x7FFFFFFF) | (($copya->e[1] & 1) ? ECC_MSB : 0);
$copya->e[1] = (($copya->e[1] >> 1) & 0x7FFFFFFF) | (($copya->e[0] & 1) ? ECC_MSB : 0);
/* unlooped */
$copya->e[0] = (($copya->e[0] >> 1) & 0x7FFFFFFF) | $bit;
return $copya;
}
tengo tres problemas al tratar de solucionar este problema a mí mismo:
- no es mi código, así que no estoy familiarizado con lo que está tratando de hacer.
- Ya no tengo un servidor de 32 bits para probarlo contra
- Soy adecuado, pero no un experto en PHP.
Me gustaría saber si alguien ve una solución simple para permitir que este código funcione en un servidor de 64 bits y brinde el mismo resultado que en un servidor de 32 bits.
Si no es así, ¿cómo recomendaría que depure esto dado que no tengo un resultado de 32 bits para comparar?
Aquí es un poco de discusión con respecto a este problema, y un intento de conseguir el desarrollador para solucionarlo: How to get the outdated 32bit keymaker.php Script Working on 64 bit
Es necesario configurar una versión de 32 bits de PHP, tal vez mediante la ejecución de una primera máquina virtual de 32 bits. –
Además, si no puede hacer una comparación cara a cara, ¿cómo sabe que el problema es el código anterior? –
@OliCharlesworth: Es una conjetura, basada en la solución que necesitaba originalmente y sobre la cuestión relacionada Stackoverflow entonces me había pedido: http://stackoverflow.com/questions/397738/32-to-64-bit-gotchas-in -php – lkessler