我已经使用unpack来转换我在二进制文件中的大多数数据类型,我正在解析它时遇到的问题很少。我不知道如何使用64位长签名的大端。我认为这种数据类型是使用2的补码存储的。我正在阅读的数据文件的应用程序是一个java应用程序,因此我认为它是2的补充。我不需要将它作为一个数字使用它,而只需将它作为一个字符串使用。
答案 0 :(得分:0)
Java 64位整数确实本地存储为“网络顺序”(大端,即以最高有效字节开始)8字节2的补码格式。所以通常你一次拿字节,向左移8,重复。字节值可以被认为是无符号的(虽然结果是有符号的),但是对于左移,这应该无关紧要。 所以:首先,你只是从字节创建了等效的64位int,并从那里显示。使用捷径没有意义;虽然有可能,但最终会得到更复杂,效率更低的代码。
答案 1 :(得分:0)
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功能。)