PHP - Error missmatch en PHP y JS

   
Vista:

Error missmatch en PHP y JS

Publicado por unoMasDelMonton (32 intervenciones) el 17/08/2015 00:31:51
Buenas y saludos. Hoy vengo con un quebradero de cabeza para mi.

La cuestión es que hay una operación que me está dejando tontete.

La operación es esta en concreto con estos operandos:

-5270299 ^ 0xa867df55

El ^ es el operador bitwise o xor bit a bit.

El problema es que al ser evaluado en JS (tanto en FF como en Chromium) el valor de esta operación es
1472744368

Pero cuando es evaluado en PHP, Octave y wolframalpha el valor resultante es:
-2822222928

Otras operaciones con el mismo operador dan lo correcto en todos los lenguajes. Por ejemplo:
-7236359 ^ 0x5005713c = -1349196347


La cuestión es... como poder reproducir el resultado de JS en el resto de lenguajes. Qué cojones hace JS para darme ese resultado.

Gracias por vuestra ayuda!
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
1
Responder

Error missmatch en PHP y JS

Publicado por unoMasDelMonton (32 intervenciones) el 17/08/2015 01:21:55
Solucionado.

El problema es que JS antes de hacer la operación recorta las variables a 32 bits mientras que PHP y el resto las hacen con 64 y por tanto con más precisión.

Gracias por leelo :)

1
2
3
4
$a=-5270299;
$b=0xa867df55;
echo bindec(decbin(bindec(substr(decbin($a),32))^$b));
//Resultado : 1472744368

A alguien se le ocurre hacer esa función más pequeña?
**PD: $b tb deberia de recortarse a 32 bits si fuese necesario.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de xve

Error missmatch en PHP y JS

Publicado por xve (5519 intervenciones) el 17/08/2015 09:18:18
Muy bueno tu comentario!!!! lo desconocía por completo!!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Error missmatch en PHP y JS

Publicado por unoMasDelMonton (32 intervenciones) el 17/08/2015 10:48:03
Vengo con más datos. Al final hice una función para tratar los números positivos y negativos de los 64bits de PHP a 32bits de JS:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function to32($value){
 
    if ($value < -2147483648)
    {
	    $return = bindec(substr(decbin($value),32));
    }
    elseif ($value > 2147483647)
    {
        $return = -($value ^ 0xFFFFFFFF)-1;
    }else {
    	$return=$value;
    }
 
    return $return;
}

Y gracias xve.

Si quiere te comento cómo llegué a este problema.

Estoy montando un bot para telegram y una de las funcionalidades es realizar peticiones a la web de la RAE.
El caso es que la web, en este caso http://buscon.rae.es/drae/srv/search?val=test devuelve un formulario con campos ocultos. En uno de esos campos se inserta el resultado de unas operaciones realizadas mediante JS.
El problema viene cuando quieres recrear esas mismas funciones JS para enviar el formulario desde PHP.
Por lo que porté las funciones a PHP y me di cuenta que el resultado no era el mismo.Después de unos dias escudriñando el código encontré que una operación (la de xor bit a bit) era la que me daba erróneo.
Así que después de mucha comida de tarro llegas a que PHP en entornos de 64bits usa int de 64bits(obvio) y que JS en todas las operaciones bit a bit primero transforma las variables de entrada a 32bits y el resultado es de 32bits.

Bueno eso, que al final llegas a la función esa de ahi arriba y das gracias al MEV y realizas varios ritos de alegría con coladores en la cabeza :).

Un saludo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de xve

Error missmatch en PHP y JS

Publicado por xve (5519 intervenciones) el 17/08/2015 18:35:22
Excelente!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar