我有一个Java类
public class MsgLayout{
int field1;
String field2;
long field3;
}
我必须将此对象写为 Socket 输出流中的字节数组。这三个字段(实例变量)有一个布局。即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
简而言之,问题在于如何将字段适应布局定义的大小。例如FIELD1_OFFSET = 0, FIELD1_SIZE=1, FIELD2_OFFSET=1, FIELD2_SIZE=4, FIELD3_OFFSET=5, FIELD3_SIZE=8.
现在当我转换field1
成字符串时,转换成字节 [] 时它不适合 1 个字节。如果我不转换为字符串,并使用 putInt(int) 它将 4 个字节写入结果字节数组。