4

我知道这可能不是最好的主意,但我一直在尝试读取使用 Java 的 DataOutputStream 编码的 PHP 文件。

具体来说,在 Java 中我使用:

dataOutputStream.writeInt(number);

然后在 PHP 中,我使用以下命令读取文件:

$data = fread($handle, 4);
$number = unpack('N', $data);

奇怪的是,PHP 中唯一给出正确值的格式字符是“N”,它应该表示“无符号长整数(总是 32 位,大端字节序)”。我以为int在java中总是签名的?

是否有可能以这种方式可靠地读取用 Java 编码的数据?在这种情况下,整数只需要为正数。它可能还需要非常大,因此writeShort()是不可能的。否则我当然可以使用 XML 或 JSON 之类的。

4

2 回答 2

2

这很好,只要你不需要额外的一点。l(而不是N) 将在大端机器上工作。

但是请注意,您可以存储的最大数字是 2,147,483,647,除非您想在 Java 端进行一些数学运算以获得正确的负整数来表示所需的无符号整数。

注意一个有符号的Java整数使用二进制补码的方法来表示一个负数,所以并不像翻转一下那么简单。

于 2012-05-02T18:36:21.923 回答
2

DataOutputStream.writeInt

将一个 int 作为四个字节写入底层输出流,先是高字节。

可用于有符号整数的解包函数的格式都使用机器相关的字节顺序。我的猜测是您的机器使用与 Java 不同的字节顺序。如果这是真的,DataOutputStream + unpack 组合将不适用于任何已签名的原语。

于 2012-05-02T18:48:07.727 回答