2013-01-18 5 views
7

Ich habe den folgenden Code:Packen und Entpacken 64-Bit-Integer

$packed = pack('i',PHP_INT_MAX); 
echo unpack('i', $packed)[1]; 

Als Ergebnis, das ich -1

bekomme ich bin mit PHP 5.4.6-1ubuntu1.1 (cli) (built: Nov 15 2012 01:18:34) und meine PHP_INT_MAx zu 9223372036854775807

gleich Gibt es jede Möglichkeit, mit pack Funktion und 64-Bit-Ganzzahlen zu arbeiten?

+1

Ich bin mir nicht ganz sicher, das ist relevant, weil ich nie haben verwendet 'pack', aber bedenke, dass -1 codiert ist, wobei alle Bits auf eins gesetzt sind, was auch die maximale vorzeichenlose Integer-Wert-Codierung ist. Ich würde es mit einer großen Zahl versuchen, die etwas kleiner ist. – zneak

Antwort

19

speichern Sie es als zwei 32Bit statt:

$value = PHP_INT_MAX; 
$highMap = 0xffffffff00000000; 
$lowMap = 0x00000000ffffffff; 
$higher = ($value & $highMap) >>32; 
$lower = $value & $lowMap; 
$packed = pack('NN', $higher, $lower); 

list($higher, $lower) = array_values(unpack('N2', $packed)); 
$originalValue = $higher << 32 | $lower;