• ベストアンサー

バイトスワップ

現在、X86向けのプログラムを組んでいます。 Pentium等のプロセッサはリトルエンディアンですが、 Javaでファイル出力を行うとビッグエンディアンで出力してしまいます。 intやshortはシフト等を利用しバイトスワップを行うメソッドを自前で作成したのですが、 floatがうまくいきません。 シフト演算やビット演算を行おうとするとコンパイルエラーになってしまいます。 floatで宣言したものに対してバイトスワップを行う方法は何かありませんでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • deadlock
  • ベストアンサー率67% (59/87)
回答No.3

えーと…  Javaから出力したファイルを別の言語で使用したいので、  (X86の)その言語が使用できる形で出力したい。  そのために、リトルエンディアンでファイルに変換したい。 という意味でいいでしょうか? Javaで書き出し/Javaで読み込み なら、特に変換する必要ないです。 >Javaでファイル出力を行うと の部分をどうやったのかをちょっと知りたいです。 DataOutputStream#writeFloat()あたりですか? Float#floatToIntBits() で、ビット表現が同じintを得ることができるようです。 これをスワップして出力するのはどうですか? DataOutputStream#writeFloat()も、この方法で変換を掛けてからwriteInt()を呼び出しています。 >JavaVM上で動作させているので、リトルエンディアンのCPUを使用しても >ビッグエンディアンになってしまう~~~ この認識でいいです。このあたりの機種依存はVMが吸収します。 でないと、オブジェクトのシリアライズなどができなくなりますね。

tune222
質問者

お礼

おっしゃる通り、DataOutputStreamを用意し、writeFloatで出力していました。 floatToIntBits()というメソッドがあるのですね。 同じビット表現のintが得られればできそうです。 Javaを始めたばかりで、プリミティブ型に用意された メソッドの勉強不足でした。 非常に参考になりました。 ありがとうございます。

その他の回答 (2)

  • yasuch
  • ベストアンサー率41% (27/65)
回答No.2

そもそも float など 浮動小数点型は機種依存なので バイトスワップすること自体間違ってますよ。 http://www.microsoft.com/japan/msdn/library/ja/vccore/html/_core_ieee_floating.2d.point_representation_and_microsoft_languages.asp

参考URL:
http://www.ffortune.net/comp/develop/data/kazu.htm
tune222
質問者

補足

参考のリンクを見るとC/C++のようです。 プログラムはJavaで書いています。 JavaVM上で動作させているので、リトルエンディアンのCPUを使用しても ビッグエンディアンになってしまうというのが個人的解釈ですが、間違っているでしょうか?

  • ngsvx
  • ベストアンサー率49% (157/315)
回答No.1

質問がおかしいです。 >コンパイルエラーになってしまいます。 >floatで宣言したものに対してバイトスワップを行う方法は何かありませんでしょうか? コンパイルエラーだということは、方法があっているかの以前の問題で、記述が間違えているということです。 文法を確認してください。 文法がわからないのなら、コンパイルエラーの発生したコードを記述し、「どこがおかしいのでしょうか」という質問をするべきです。

tune222
質問者

補足

例に挙げた方法だとエラーになるので、何か他のアプローチはないでしょうか、といった意味です。 説明不足で申し訳ありません。

関連するQ&A

専門家に質問してみよう