Pregunta

Tengo una cadena en PHP (vino de alguna fuente de datos), que representa un entero sin signo de 32 bits con formato. Necesito almacenar en una base de datos MySQL como un firmó entero de 32 bits, por lo que después puedo recuperarlo de PHP y utilizarlo como una (posiblemente negativo) firmó entero constante (a partir de PHP doesn' t tiene enteros sin signo).

Por lo tanto, lo que necesito es un método de conversión, ya sea para PHP o MySQL. No debe ser dependiente de la plataforma (no / 32 / cuestiones endian de 64 bits).

Yo sé cómo convertir un entero sin signo en el uso de MySQL:

select CAST((-1062726980 & 0xFFFFFFFF) AS UNSIGNED INTEGER);
+------------------------------------------------------+
| CAST((-1062726980 & 0xFFFFFFFF) AS UNSIGNED INTEGER) |
+------------------------------------------------------+
|                                           3232240316 | 
+------------------------------------------------------+

Pero no puedo conseguir que funcione al revés. (Nota: MySQL usa la aritmética de 64 bits al hacer moldes)

Gracias.

¿Fue útil?

Solución 2

Este:

$val = (bccomp("2147483647", $val) < 0) ? bcsub($val, "4294967296") : $val;

Parece que funciona, aunque es algo lento.

Otros consejos

Si usted acaba de emitir el número a un entero en PHP, que va a hacer el truco.

echo (int)3232240316 . "\n";

da

-1062726980

Nota: si desea emitir un int firmado a un entero sin signo en PHP, simplemente hacer esto:

$number += 4294967296;

Ejemplo:

$number = -1062726980;
echo $number . "\n";
$number += 4294967296;
echo $number . "\n";

da:

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