Frage

Ich habe eine Zeichenfolge in PHP (von einiger Datenquelle kam), die eine formatierte unsigned 32-Bit-Ganzzahl darstellt. Ich brauche es in eine MySQL-Datenbank zu speichern, wie ein unterzeichnet 32-Bit-Integer, so dass später ich es von PHP abrufen und verwenden Sie es als (möglicherweise negativ) Integer-Konstante unterzeichnet (seit PHP doesn‘ t ganze Zahlen ohne Vorzeichen haben).

Also, was ich brauche, ist ein Umwandlungsverfahren, entweder für PHP oder MySQL. Es sollte nicht plattformabhängig sein (keine Endian / 32/64-Bit-Ausgaben).

Ich weiß, wie eine Ganzzahl mit Vorzeichen in unsigned mit MySQL konvertieren:

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

Aber ich kann es nicht um die andere Art und Weise erhalten arbeiten. (Anmerkung: MySQL verwendet 64-Bit-Arithmetik, wenn Abgüsse tun)

Danke.

War es hilfreich?

Lösung 2

Dieses:

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

scheint zu funktionieren, auch wenn es etwas langsam.

Andere Tipps

Wenn Sie nur die Zahl auf eine ganze Zahl in PHP werfen, wird es den Trick.

echo (int)3232240316 . "\n";

gibt

-1062726980

Hinweis: Wenn Sie eine signierte int zu einem unsigned int in PHP werfen wollen, gerade dies tun:

$number += 4294967296;

Beispiel:

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

gibt:

-1062726980
3232240316
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top