Просто используйте ByteBuffer и пакет nio.Таким образом, вы можете легко читать данные из сети, и вам не нужно беспокоиться об Endianess (это важно! Если вы используете потоки, вам, скорее всего, придется реализовать сдвиг самостоятельно - хотя это может быть хорошим упражнением).Не забудьте установить порядковый номер буфера на правильное значение.Мы используем int для внутреннего использования, потому что a) все математические операции в любом случае возвращают ints и b) вы можете обрабатывать значения как беззнаковые.
ByteBuffer buffer = ByteBuffer.allocate(100);
// read data into buffer
buffer.rewind();
buffer.order(ByteOrder.LITTLE_ENDIAN);
// 0xf and co mask off sign extension -> handle byte as unsigned
int type = (buffer.get() >> 4) & 0xf;
int origin = buffer.getShort() & 0xffff;
int receiver = buffer.getShort() & 0xffff;
// and so on
, чтобы записать данные обратно, вы в значительной степени делаете обратное:
ByteBuffer buffer = ByteBuffer.allocate(100);
buffer.rewind();
buffer.put((byte)(type << 4));
buffer.putShort((short)origin);
// and so on
Редактировать: Обычно вы считываете данные непосредственно в ByteBuffer из сетевого канала и используете пакет Java NIO.Краткое руководство: здесь .Но так как у вас уже есть Socket, мы сделаем это немного проще.Обратите внимание, что я проигнорировал всю проверку ошибок для краткости.Использование OutputStream и WritableByteChannel (с записью) работает в другом направлении.
InputStream is = socket.getInputStream();
ReadableByteChannel source = Channels.newChannel(istream);
ByteBuffer buffer = ByteBuffer.allocateDirect(headerSize);
source.read(buffer);
// now header is in buffer and can be used as seen above.