[英]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.