2

php 関数を使用してバイナリ データを作成しましたpack。次に、このデータを Java アプリケーションから解凍する必要がありました。整数、文字列、long、およびその他のデータ型をアンパックできましたが、float に問題があります。

次のようなコードを使用してphpからデータを作成します

pack("f", 189.0);

次に、JavareadFloat()でオブジェクトからメソッドを使用していDataInputStreamますが、小さくて一貫性のない値を取得します。

どうやら php と java は異なる表記法を使用してフロートを表しています。この問題を解決し、php パック フロートからネイティブ Java フロートに変換するにはどうすればよいですか?

4

2 に答える 2

3

私はこのコードを使用して私の問題を解決することができました:バイトはフロートに変換されます(php)

私はJavaで次のユーティリティメソッドを作成しました.DataInputStreamsで非常にうまく機能します:

protected static float readFloat(DataInputStream stream) throws IOException
{
    byte byte0 = stream.readByte();
    byte byte1 = stream.readByte();
    byte byte2 = stream.readByte();
    byte byte3 = stream.readByte();

    int i = (byte3 & 0xff) << 24 | (byte2 & 0xff) << 16 | (byte1 & 0xff) << 8 | byte0 & 0xff; 
    return Float.intBitsToFloat(i);
}
于 2011-06-23T04:11:33.057 に答える
2

エンディアンを指定することも、使用される表現についての保証を得ることができないため、pack関数は標準のfloatバイナリ表現を作成するための最良の選択ではないようです。

これにより、あまり一般的でないマシンや構成で微妙なバグや微妙でないバグが発生する可能性があります(または、一般的な場合でも、phpはIEEE 754も使用していると思いますが、指定されていないafaikです!)が、最も可能性の高い問題は、Javaがビッグエンディアンを想定していることです。取得するデータはリトルエンディアンでエンコードされています。

自分で変換を行うか(それほど難しくはなく、基本的には些細なラッパー)、バイトオーダーを指定できるnioクラス(つまりByteBuffer)を使用することができます。

phpがより多くの保証を備えた機能を持っているかどうかはわかりませんが(何かがあると確信しています)、より大きなパッケージを使用していて、精度が低下している場合は、文字列を転送できます。これにより、これらの問題を回避できます。

于 2011-06-21T22:14:40.300 に答える