32-битный PHP будет иметь только 32-битные целые числа со знаком, поэтому, насколько я знаю, нет способа изначально распаковать данные.
Следующий код должен быть способен читать двоичный код, двоичное 64-разрядное целое число с дополнением до двух:
<?php
function read_int64($fp)
{
$hex = unpack('H16a', fread($fp, 8));
$hex = '0x'.$hex['a'];
$n = gmp_init($hex);
if (gmp_testbit($n, 63))
{
$n = gmp_xor($n, '0xffffffffffffffff'); // flip the bits
$n = gmp_neg(gmp_add($n, 1)); // add one and negate
}
return gmp_strval($n);
}
?>
Возвращает целое число в виде строки. Может использоваться как:
$fp = fopen('test.bin', 'rb');
echo read_int64($fp)."\n";
fclose($fp);
(Редактировать: обновлен код для вызова меньшего количества функций GMP.)