如何将Java 64位长度从二进制文件解析为PHP字符串?

时间:2010-09-12 00:23:39

标签: php 64-bit binary long-integer

我已经使用unpack来转换我在二进制文件中的大多数数据类型,我正在解析它时遇到的问题很少。我不知道如何使用64位长签名的大端。我认为这种数据类型是使用2的补码存储的。我正在阅读的数据文件的应用程序是一个java应用程序,因此我认为它是2的补充。我不需要将它作为一个数字使用它,而只需将它作为一个字符串使用。

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功能。)