- ベストアンサー
バイトスワップ
現在、X86向けのプログラムを組んでいます。 Pentium等のプロセッサはリトルエンディアンですが、 Javaでファイル出力を行うとビッグエンディアンで出力してしまいます。 intやshortはシフト等を利用しバイトスワップを行うメソッドを自前で作成したのですが、 floatがうまくいきません。 シフト演算やビット演算を行おうとするとコンパイルエラーになってしまいます。 floatで宣言したものに対してバイトスワップを行う方法は何かありませんでしょうか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
えーと… Javaから出力したファイルを別の言語で使用したいので、 (X86の)その言語が使用できる形で出力したい。 そのために、リトルエンディアンでファイルに変換したい。 という意味でいいでしょうか? Javaで書き出し/Javaで読み込み なら、特に変換する必要ないです。 >Javaでファイル出力を行うと の部分をどうやったのかをちょっと知りたいです。 DataOutputStream#writeFloat()あたりですか? Float#floatToIntBits() で、ビット表現が同じintを得ることができるようです。 これをスワップして出力するのはどうですか? DataOutputStream#writeFloat()も、この方法で変換を掛けてからwriteInt()を呼び出しています。 >JavaVM上で動作させているので、リトルエンディアンのCPUを使用しても >ビッグエンディアンになってしまう~~~ この認識でいいです。このあたりの機種依存はVMが吸収します。 でないと、オブジェクトのシリアライズなどができなくなりますね。
その他の回答 (2)
- yasuch
- ベストアンサー率41% (27/65)
そもそも float など 浮動小数点型は機種依存なので バイトスワップすること自体間違ってますよ。 http://www.microsoft.com/japan/msdn/library/ja/vccore/html/_core_ieee_floating.2d.point_representation_and_microsoft_languages.asp
補足
参考のリンクを見るとC/C++のようです。 プログラムはJavaで書いています。 JavaVM上で動作させているので、リトルエンディアンのCPUを使用しても ビッグエンディアンになってしまうというのが個人的解釈ですが、間違っているでしょうか?
- ngsvx
- ベストアンサー率49% (157/315)
質問がおかしいです。 >コンパイルエラーになってしまいます。 >floatで宣言したものに対してバイトスワップを行う方法は何かありませんでしょうか? コンパイルエラーだということは、方法があっているかの以前の問題で、記述が間違えているということです。 文法を確認してください。 文法がわからないのなら、コンパイルエラーの発生したコードを記述し、「どこがおかしいのでしょうか」という質問をするべきです。
補足
例に挙げた方法だとエラーになるので、何か他のアプローチはないでしょうか、といった意味です。 説明不足で申し訳ありません。
お礼
おっしゃる通り、DataOutputStreamを用意し、writeFloatで出力していました。 floatToIntBits()というメソッドがあるのですね。 同じビット表現のintが得られればできそうです。 Javaを始めたばかりで、プリミティブ型に用意された メソッドの勉強不足でした。 非常に参考になりました。 ありがとうございます。