プロが教える店舗&オフィスのセキュリティ対策術

現在、X86向けのプログラムを組んでいます。
Pentium等のプロセッサはリトルエンディアンですが、
Javaでファイル出力を行うとビッグエンディアンで出力してしまいます。

intやshortはシフト等を利用しバイトスワップを行うメソッドを自前で作成したのですが、
floatがうまくいきません。
シフト演算やビット演算を行おうとするとコンパイルエラーになってしまいます。

floatで宣言したものに対してバイトスワップを行う方法は何かありませんでしょうか?

A 回答 (3件)

えーと…


 Javaから出力したファイルを別の言語で使用したいので、
 (X86の)その言語が使用できる形で出力したい。
 そのために、リトルエンディアンでファイルに変換したい。
という意味でいいでしょうか?
Javaで書き出し/Javaで読み込み なら、特に変換する必要ないです。
>Javaでファイル出力を行うと
の部分をどうやったのかをちょっと知りたいです。
DataOutputStream#writeFloat()あたりですか?


Float#floatToIntBits()
で、ビット表現が同じintを得ることができるようです。
これをスワップして出力するのはどうですか?
DataOutputStream#writeFloat()も、この方法で変換を掛けてからwriteInt()を呼び出しています。


>JavaVM上で動作させているので、リトルエンディアンのCPUを使用しても
>ビッグエンディアンになってしまう~~~
この認識でいいです。このあたりの機種依存はVMが吸収します。
でないと、オブジェクトのシリアライズなどができなくなりますね。
    • good
    • 0
この回答へのお礼

おっしゃる通り、DataOutputStreamを用意し、writeFloatで出力していました。

floatToIntBits()というメソッドがあるのですね。
同じビット表現のintが得られればできそうです。

Javaを始めたばかりで、プリミティブ型に用意された
メソッドの勉強不足でした。
非常に参考になりました。
ありがとうございます。

お礼日時:2005/08/26 05:12

そもそも float など 浮動小数点型は機種依存なので


バイトスワップすること自体間違ってますよ。

http://www.microsoft.com/japan/msdn/library/ja/v …

参考URL:http://www.ffortune.net/comp/develop/data/kazu.htm

この回答への補足

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

補足日時:2005/08/25 18:30
    • good
    • 0

質問がおかしいです。




>コンパイルエラーになってしまいます。
>floatで宣言したものに対してバイトスワップを行う方法は何かありませんでしょうか?

コンパイルエラーだということは、方法があっているかの以前の問題で、記述が間違えているということです。

文法を確認してください。

文法がわからないのなら、コンパイルエラーの発生したコードを記述し、「どこがおかしいのでしょうか」という質問をするべきです。

この回答への補足

例に挙げた方法だとエラーになるので、何か他のアプローチはないでしょうか、といった意味です。

説明不足で申し訳ありません。

補足日時:2005/08/25 18:28
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!