2011-12-08 3 views
4

Javaはどのようにエンディアンを処理しますか?リトルエンディアンからビッグエンディアンへ、またはその逆にアプリケーションを移動する場合。 クラスのデータメンバーまたはプロパティはどのように影響を受けますか?Javaとendianness

+3

エンドエンディアンは、生データを読み書きする場合にのみ重要です。ネットワークインターフェースまたはディスク。 –

+0

@OliCharlesworth、またはデータをIPC経由で、あるいはパイプ経由で、またはファイルから受信していますか...データを読み書きしているときはいつでも、もう片方のものはjavaではありません。 –

答えて

3

を明確にするために編集しました。古いコアライブラリはネットワークオーダーを想定しています。

ByteBufferより:

バイナリデータへのアクセス

このクラスは、ブールを除き、他の全てのプリミティブ型の読み書きの値のための方法を定義します。プリミティブの値は、バッファの現在のバイトオーダーに従って、バイトのシーケンスに変換されます(またはシーケンスから変換されます)。特定のバイトオーダーは、ByteOrderクラスのインスタンスで表されます。バイトバッファの最初の順序は常にBIG_ENDIANです。

およびByteOrderは、作業中のプラットフォームのnative orderへのアクセスを提供します。

DataInput年上に地元のネイティブサービスとの相互運用のために有用ではないであることを比較します

は4バイトの入力データを読み込んで、int型の値を返します。 a-dを最初から4バイト目まで読み込ませる。戻り値は次のとおり

(((a & 0xff) << 24) | ((b & 0xff) << 16) | 
((c & 0xff) << 8) | (d & 0xff)) 
8

Java仮想マシンは、Java内で完全に作業している限り、心配する必要がないように、この考慮事項を抽象化しています。バイト順を考慮する必要がある唯一の理由は、Java以外のプロセスなどと通信している場合です。

編集:あなたがByteBuffer上で、より大きなタイプのバッファをマッピングしているなら、あなたはByteOrder値を使用して、エンディアンを指定することができ文言

+1

downvoteする必要があります。 endiannessについて心配するもう一つの主要な時間があります。これは、あなたが異なるendinessを持つJava以外のアプリケーションによって書き出されたバイナリファイルを扱うときです。 endinessは言葉ですか? :-) – user949300

+2

答えが改訂されたので、解読してはいけません。 –

+0

@ user949300「java以外のプロセスと通信する」という見出しの下にあるとは言っても、あなたの言うことは真実です。 – nonVirtualThunk

2

クラスファイルフォーマット自体はビッグエンディアン(またはむしろ、クラスファイル内のすべての複数バイトのデータは、このような方法で格納されている):

Class file format

すべての16ビット、32ビット、および64ビットの量は、それぞれ2つ、4つ、8つの連続した8ビットのバイトを読み取ることによって構成されます。マルチバイトのデータ項目は、常にビッグエンディアンの順序で格納され、上位バイトが最初に来ます。

しかし、実際には他の人に言われているように、これについてほとんど心配する必要はありません。

関連する問題