人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

Javaのバイトオーダーについて質問です。

1.Javaではデータをビッグエンディアンで格納していますが、Javaで書いたアプリをPentiumのようなリトルエンディアン環境で動作させる際には、VMが自動的にリトルエンディアンに変換して動作させているのでしょうか?

2.もしVMがバイトオーダーを吸収しているとしたとき、にもかかわらずなぜhtons()やhtonl()などプログラマが明示的にバイトオーダーを意識しないといけないのでしょうか?

●質問者: tono5652
●カテゴリ:コンピュータ
✍キーワード:Java Pentium VM アプリ エンディアン
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● yusukey
●30ポイント

1. はい。そうです。

2. htons() や htonl() は C の関数ではないでしょうか?

Java のプログラム内でエンディアンを意識することはないと思います。

http://www.jguru.com/faq/view.jsp?EID=25977

◎質問者からの返答

>htons() や htonl() は C の関数ではないでしょうか?

今確かめてみたらどうやらそのようですね。ありがとうございます。


2 ● wnagata
●40ポイント ベストアンサー

1.

http://sdc.sun.co.jp/java/docs/j2se/1.4/ja/docs/ja/api/java/nio/...

を読むと、Javaではバイナリデータを読み込むと自動的にビッグエンディアンに変換し、書き込むときにはプラットフォームごとのエンディアンで出力しています。その際、VMごとにデフォルトの動作が決められています。そのため、Intel系のリトルエンディアンのマシンでは、VMへの入力時にビッグエンディアンへの変換が、出力時にリトルエンディアンへの変換が行われています。なお、ネットワーク経由でデータを送受信する場合は、必ずビッグエンディアンで行われるので、変換は不要です。

2.

htons()やhtonl()はC言語の関数ですから、Javaとは直接関係はありません。Javaでは通常、バイトオーダーを意識する必要はありませんが、画像のexif情報を解析するときなどは、ファイルのヘッダーを読みこんで、ボディのバイトオーダーを判定して、その後の処理を切り替えなければいけませんので、自分でエンディアンの変換を行う必要があります。そのためのメソッドがjava.nioパッケージのクラスには用意されています。

◎質問者からの返答

丁寧に解説していただき感謝します。

ちょうど次の疑問として java.nio パッケージの使いどころが浮かんでいたので、同時に解決していただきありがとうございます。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ