繁体   English   中英

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

[英]How can you parse a Java 64-bit long from a binary file into a PHP string?

我已经使用unpack转换了我解析的二进制文件中存在的大多数数据类型,几乎没有问题。 我不知道如何使用64位长签名大字节序。 我认为此数据类型使用2的补码存储。 我正在读取的数据文件的应用程序是一个Java应用程序,因此我假设它是2的补码。 我不需要将其作为数字使用,而只是将其作为字符串使用。

Java 64位整数确实以“网络顺序”(大端,即从最高有效字节开始)本地存储为8字节2的补码格式。 因此,通常您一次取一个字节,向左移8个重复。 字节值可以认为是无符号的(结果是有符号的),但是通过左移,这无关紧要。 因此:首先,您刚刚从字节创建了等效的64位int,然后从那里显示。 使用捷径毫无意义; 尽管有可能,但最终只会得到更复杂,效率更低的代码。

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函数。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM