Имам 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 байт, когато се преобразува в байт []. Ако не преобразувам в String и използвам putInt(int), той записва 4 байта в получения масив от байтове.