Domanda

Ho una stringa in PHP (è venuto da una sorgente di dati), che rappresenta un senza segno a 32 bit intero formattato. Ho bisogno di memorizzare in un database MySQL come firmato intero a 32 bit, in modo che poi posso recuperare da PHP e usarlo come una (possibilmente negativo) hanno firmato integer costante (da PHP doesn' t avere interi senza segno).

Allora, che cosa ho bisogno è un metodo di conversione, sia per PHP o MySQL. Non dovrebbe essere dipendente dalla piattaforma (nessun endian / 32 / problemi a 64 bit).

Io so come convertire un intero con segno in unsigned utilizzando MySQL:

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

Ma io non riesco a farlo funzionare il contrario. (Nota: MySQL utilizza 64 bit aritmetica quando si fa calchi)

Grazie.

È stato utile?

Soluzione 2

Questa:

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

sembra funzionare, anche se è un po 'lento.

Altri suggerimenti

Se hai appena lanci il numero in un intero in PHP, esso farà il trucco.

echo (int)3232240316 . "\n";

-1062726980

Nota: se si vuole lanciare un int firmato per un unsigned int in PHP, basta fare questo:

$number += 4294967296;

Esempio:

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

dà:

-1062726980
3232240316
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top