В зависимости от того, откуда вы получаете эти 4 байта:
http://docs.oracle.com/javase/7/docs/api/java/io/DataInput.html#readInt()
http://docs.oracle.com/javase/7/docs/api/java/nio/ByteBuffer.html#getInt(int)
Конечно, вы все равно можете сделать это вручную, но в большинстве случаев, используя один из них (если вам нужно преобразовать байтовый массив с большим количеством байтов, вы можете использовать DataInputStream
, например, ByteArrayInputStream
) проще.
Редактировать : Если вам нужно изменить порядок байтов, вам придется использовать ByteBuffer, либо самостоятельно инвертировать байты, либо выполнить преобразование самостоятельно, поскольку DataInput не поддерживает изменение порядка байтов.
Edit2 : Когда вы получаете их из входного потока сокета, я помещаю его в DataInputStream
и использую его для чтения всех видов данных. Тем более что InputStream.read (byte []) не гарантирует заполнение всего байтового массива ... DataInputStream.readFully делает.
DataInputStream in = new DataInputStream(socket.getInputStream());
byte aByte = in.readByte();
int anInt = in.readInt();
int anotherInt = in.readInt();
short andAShort = in.readShort(); // 11 bytes read :-)
byte[] lotOfBytes = new byte[anInt];
in.readFully(lotOfBytes);
Edit3 : при многократном чтении из потока они продолжат чтение с того места, где вы остановились, т.е. е. aByte будет байтом 0, anInt будет байтами с 1 по 4, anotherInt будет байтами с 5 по 8 и т. д. readFully продолжит чтение после всего этого и будет блокироваться, пока не прочитает lotOfbytes
.
Когда поток останавливается (соединение обрывается), вы получите EOFException
вместо -1, поэтому, если вы получите -1, int действительно будет -1.
Если вы вообще не хотите разбирать какие-либо байты, вы можете пропустить () их. Синтаксический анализ одного байта двумя различными способами невозможен с DataInputStream (то есть сначала читается int из байтов 0–3, затем один из байтов 2–5), но обычно это также не требуется.
* +1032 * Пример: * 1 033 *
// read messages (length + data) until the stream ends:
while (true) {
int messageLength;
try {
messageLength = in.readInt(); // bytes 0 to 3
} catch (EOFException ex) {
// connection dropped, so handle it, for example
return;
}
byte[] message = new byte[messageLength];
in.readFully(message);
// do something with the message.
}
// all messages handled.
Надеюсь, что это ответит на ваши дополнительные вопросы.