私はJavaクラスを持っています
public class MsgLayout{
int field1;
String field2;
long field3;
}
このオブジェクトをSocket出力ストリームのバイト配列として書き込む必要があります。3つのフィールド(インスタンス変数)にはレイアウトがあります。つまりfield1
、1バイトをfield2
占有し、4バイトを占有し、 field3
8バイトを占有する必要があります。
ByteBuffer bbf = ByteBuffer.allocate(TOTAL_SIZE);
bbf.put(Integer.toString(this.getField1()).getBytes(), 0, FIELD1_SIZE);
bbf.position(FIELD2_OFFSET);
bbf.put(Long.toString(this.getField2()).getBytes(), 0, FIELD2_SIZE);
bbf.position(FIELD3_OFFSET);
bbf.put(Long.toString(this.getField3()).getBytes(), 0, FIELD3_SIZE);
byte[] msg = bbf.array();
上記のコードを使用して、バイト配列の各フィールドを目的のサイズに合わせて調整しようとしています。しかしIndexOutOfBoundException
、要するに、問題は、フィールドをレイアウトで定義されたサイズに合わせる方法に関するものです。たとえば、StringFIELD1_OFFSET = 0, FIELD1_SIZE=1, FIELD2_OFFSET=1, FIELD2_SIZE=4, FIELD3_OFFSET=5, FIELD3_SIZE=8.
に変換するとfield1
、byte[]に変換すると1バイトに収まりません。Stringに変換せず、putInt(int)を使用すると、結果のバイト配列に4バイトが書き込まれます。