4

これはおそらく最善のアイデアではないことは承知していますが、JavaのDataOutputStreamを使用してエンコードされたPHPでファイルを読み取ろうとして遊んでいます。

具体的には、Javaでは次のものを使用します。

dataOutputStream.writeInt(number);

次に、PHPで次のコマンドを使用してファイルを読み取ります。

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

奇妙なことに、正しい値を与えるPHPのフォーマット文字は「N」だけです。これは「unsignedlong(常に32ビット、ビッグエンディアンバイトオーダー)」を表すことになっています。私intはJavaで常に署名されていると思いましたか?

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

4

2 に答える 2

2

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

ただし、Java側で計算を行って、目的の符号なし整数を表す適切な負の整数を取得する場合を除いて、格納できる最大数は2,147,483,647であることに注意してください。

符号付きJava整数は、2の補数法を使用して負の数を表すため、ビットを反転するほど簡単ではないことに注意してください。

于 2012-05-02T18:36:21.923 に答える
2

DataOutputStream.writeInt

基になる出力ストリームにintを4バイトとして書き込みます。上位バイトが最初です。

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

于 2012-05-02T18:48:07.727 に答える