- 2.1. clear, flip, rewind
- 2.2. 同種バッファのビューの作成
- 2.3. 補助配列
- 2.4. バイトオーダー(ByteOrder)
2.4. バイトオーダー(ByteOrder)
バイトオーダーとは、複数バイトのデータをメモリやファイルに保存するときにどのような順番で保存するかの方式を表します。
たとえば、Javaのint型は4バイトの長さを持っています。int型で0x1234ABCD(16進数)という数字を記録するときに 0x12,0x34,0xAB,0xCDという順番で保存する方法と、0xCD,0xAB,0x34,0x12という順番で保存する方法があります(16進数表記では、2ケタで1バイトの情報が表されます)。
ビッグエンディアン
複数バイトのデータを上位バイトから順番に格納する方式です。0x1234ABCDを0x12,0x34,0xAB,0xCDという順番で保存します。
リトルエンディアン
複数バイトのデータを下位バイトから順番に格納する方式です。0x1234ABCDを0xCD,0xAB,0x34,0x12という順番で保存します。
CPU等のハードウェアはそれぞれ固有のバイトオーダーを持っています。たとえばWindowsを動作させるPCでよく使用されているPentiumシリーズはリトルエンディアン、PowerPCやUltraSPARCはビッグエンディアンが固有のバイトオーダーです。それらのハードウェアはそれぞれ固有のバイトオーダーを使用するほうが入出力処理を効率的に実行できます。ただし、ファイル入出力等においては出力時と入力時で同じバイトオーダーを使用しなければ、正しくデータを解釈できない可能性があります。java.ioパッケージの入出力機能では互換性が優先されており、DataInputStreamやDataOutputStream等の入出力クラスではハードウェア固有のバイトオーダに関わらず基本的に入出力はビッグエンディアンで行われるようになっていました。
しかし、New I/Oパッケージではバイトオーダーを取り扱うための機能が追加され、任意のバイトオーダーでの入出力が簡単に実現できるようになりました。一時的に使用するため互換性を気にする必要がない場合や、互換性よりの処理効率を優先したい場合など、ハード固有のバイトオーダーを使用することでプログラムの処理速度を上げることができる場合があります。
バイトオーダーを表すためにはjava.nio.ByteOrderクラスを使用します。ビッグエンディアンとリトルエンディアンはそれぞれByteOrderクラスのstaticメンバであるBIG_ENDIANおよびLITTLE_ENDIANによって表されます。これらはそれ自身ByteOrderクラスのインスタンスです。ByteOrderクラスのインスタンスを新しく作成することはできません。
定数名 |
説明 |
ByteOrder.BIG_ENDIAN |
ビッグエンディアン |
ByteOrder.LITTLE_ENDIAN |
リトルエンディアン |
ByteOrderクラスは以下のメソッドを持っています。
public static ByteOrder nativeOrder()
プログラムを動作させているハードウェアの固有のバイトオーダを返します。
public String toString()
バイトオーダーの文字列表現(「BIG_ENDIAN」または「LITTLE_ENDIAN」)を返します。
バッファで使用されるバイトオーダを取得および設定するにはorderメソッドを使用します。
- public ByteBuffer order(ByteOrder order) - バイトオーダーの設定
- public ByteOrder order() - バイトオーダーの取得
バイトオーダーの設定はByteBufferでしか行うことができません。バッファのビューを作成した場合、そのバッファのバイトオーダーは元となるバッファのバイトオーダーと等しくなります。例えば、ビッグエンディアンのByteBufferに対するIntBufferのビューを作成した場合、そのIntBufferへの入出力はビッグエンディアンで行われます。バイトオーダーを取得するメソッドはIntBuffer等のすべてのバッファクラスで使用することができます。
なお、バッファのデフォルトのバイトオーダーは(ハード固有のバイトオーダーではなく)ビッグエンディアンです。例外的にchar配列をラップしてCharBufferを作成した場合はハード固有のバイトオーダーとなります。
(実習課題2)
1章の実習課題2で作成したプログラムを変更し、2種類のバイトオーダーを使用して処理を実行し、実行速度の比較ができるようにしてください。またプログラムの実行時にハードウェアの固有バイトオーダーが何であるかを表示するようにしてください。