Pergunta

Eu tenho uma string em PHP (veio de alguma fonte de dados), o que representa um número inteiro de 32 bits sem sinal formatado. Eu preciso para armazená-lo em um banco de dados MySQL como um 32-bit inteiro assinado, para que mais tarde eu posso recuperá-lo de PHP e usá-lo como um (possivelmente negativo) constante inteiro assinado (desde o PHP doesn' t têm inteiros sem sinal).

Então, o que eu preciso é um método de conversão, tanto para PHP e MySQL. Não deve ser-plataforma dependente (sem problemas endian / 32/64-bit).

Eu sei como converter um inteiro assinado em não assinado usando o MySQL:

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

Mas eu não posso obtê-lo trabalhar o contrário. (Nota: MySQL usa aritmética de 64 bits ao fazer moldes)

Graças.

Foi útil?

Solução 2

Este:

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

parece funcionar, mesmo que seja um pouco lento.

Outras dicas

Se você acabou de depositar o número para um inteiro no PHP, ele irá fazer o truque.

echo (int)3232240316 . "\n";

-1062726980

Nota: se você quiser lançar um int assinado para um int não assinado em PHP, basta fazer o seguinte:

$number += 4294967296;

Exemplo:

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

dá:

-1062726980
3232240316
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top