2012-05-02 10 views
4

これはおそらく最良のアイデアではないが、私はJavaのDataOutputStreamを使ってエンコードされたファイルをPHPで読み込もうとしています。PHPのJava DataOutputStreamからバイナリデータを読み込むときの整数形式は何ですか?

具体的には、Javaで私が使用:

dataOutputStream.writeInt(number); 

次にPHPで私が使用してファイルを読む:

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

奇妙なことがあること、正しい値を与えるPHPで唯一のフォーマット文字は "N"で、これは "unsigned long(常に32ビット、ビッグエンディアンのバイトオーダ)"を表すはずです。私は、Javaのintはいつも署名されていると思った?

このようにしてJavaでエンコードされたデータを確実に読み取ることはできますか?この場合、整数は正の値になる必要があります。それはまたかなり大きい必要があるかもしれないのでwriteShort()は不可能です。それ以外の場合はもちろん、XMLやJSONなどを使用できます。

答えて

2

余分なビットが必要ない限り、これは問題ありません。 lNの代わりに)は、ビッグエンディアンのマシンで動作します。

ただし、必要な符号なし整数を表す適切な負の整数を取得するためにJava側で何らかの計算を行う場合を除き、格納できる最大数は2,147,483,647です。

署名されたJava整数は、2の補数法を使用して負の数を表すため、ビットを反転するほど簡単ではありません。

2

DataOutputStream.writeInt

は、第一の高バイト 、4バイトとして基本となる出力ストリームにINTを書き込み。

符号付き整数のアンパック機能で使用できる形式はすべて、マシン依存のバイト順序を使用します。私の推測では、あなたのマシンはJavaとは異なるバイトオーダーを使用しているということです。そうであれば、署名されたプリミティブに対してDataOutputStream + unpackの組み合わせは機能しません。

関連する問題