2009-07-18 8 views
8

J'ai une chaîne en PHP (provenant d'une source de données), qui représente un entier non signé formaté de 32 bits. Je dois le stocker dans une base de données MySQL comme signé entier 32 bits, de sorte que plus tard je peux le récupérer de PHP et l'utiliser comme une constante entière (éventuellement négative) signée integer (puisque PHP n'a pas d'entiers non signés). Donc, ce dont j'ai besoin, c'est d'une méthode de conversion, que ce soit pour PHP ou MySQL. Il ne devrait pas être dépendant de la plateforme (pas de problèmes endian/32/64-bit).Comment faire pour convertir un entier de 32 bits de non signé à signé en MySQL ou PHP?

Je sais comment convertir un entier signé en utilisant MySQL non signé:

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

Mais je ne peux pas le faire fonctionner dans l'autre sens (note: MySQL utilise l'arithmétique 64 bits lorsque vous faites des moulages).

Merci.

Répondre

0

Ce:

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

semble fonctionner, même si elle est un peu lent.

3

Si vous venez de convertir le nombre en nombre entier en PHP, cela fera l'affaire.

echo (int)3232240316 . "\n"; 

donne

-1062726980 

Note: si vous voulez jeter un entier signé un entier non signé en PHP, faire ceci:

$number += 4294967296; 

Exemple:

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

donne:

-1062726980 
3232240316 
+1

Désolé, mais cela ne fonctionnera pas sur certains systèmes 64 bits, où PHP int est 64 bits par défaut. – Alex

Questions connexes