从PHP中的Java DataOutputStream读取二进制数据时的整数格式是什么?

时间:2012-05-02 18:24:54

标签: java php file-io

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

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

dataOutputStream.writeInt(number);

然后在PHP中我使用:

读取文件
$data = fread($handle, 4);
$number = unpack('N', $data);

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

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

2 个答案:

答案 0 :(得分:2)

这很好,只要你不需要额外的位。 l(而不是N)可以在大端机器上运行。

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

请注意,带符号的Java整数使用二进制补码方法来表示负数,因此它不像翻转那么容易。

答案 1 :(得分:2)

DataOutputStream.writeInt

  

将int作为四个字节(高字节)写入基础输出流   第一

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