2011-06-21 10 views
1

PHP関数packを使用してバイナリデータを作成しました。 それから、このデータをjavaアプリケーションから解凍する必要がありました。私は整数、文字列、longsおよび他のデータ型を解凍することができましたが、私は浮動小数点に問題があります。javaを使用してバイナリPHP packed floatを展開する

は、私は、Javaで私はDataInputStreamオブジェクトからメソッドreadFloat()を使用しています以下の

pack("f", 189.0); 

のようなコードを使用してPHPからデータを作成し、しかし、私は小さく、支離滅裂の値を取得します。

明らかに、phpとjavaは異なる表記を使用して浮動小数点数を表します。 この問題を解決し、PHPのfloat型からnative型のJava float型への変換を実行するにはどうすればよいですか?

+0

はちょうど/ビッグ・エンディアンである可能性がありますリトルエンディアンの問題? –

+1

* f - float(**マシンに依存**サイズと表現)* [ref](http://php.net/manual/en/function.pack.php) - それであなたは何を達成しようとしていますか?おそらくマシンの違いに対処する別の方法があります。 – hakre

+2

関連:[Javaリトルエンディアンまたはビッグエンディアンの整数ですか?](http://stackoverflow.com/questions/362384/are-integers-in-java-little-endian-or-big-endian) – hakre

答えて

2

endoannessを指定することも、どのような表現が使用されるかを保証することもできないので、pack関数は標準のfloatバイナリ表現を作成するための最良の選択ではないようです。

これは、あまり一般的でないマシンや設定(あるいは一般的なものでも微妙なバグにつながる可能性がありますか?phpでもIEEE 754を使用していますが、afaikは指定されていません)ビッグエンディアンとあなたが得るデータはエンディアンリトルエンディアンです。

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

phpがもっと保証付きの機能を持っているかどうかは分かりませんが(私はそこに何かがあると思いますが)、あなたが大きなパッケージをいくつか持っていて、正確性が失われれば、文字列を転送できます。

2

私はこのコードを使用して私の問題を解決することができました:bytes convert to float (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); 
} 
関連する問題