これらの 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)
もちろん、手動で行うこともできますが、ほとんどの場合、これらのいずれかを使用する方が簡単です (多数のバイトを含むバイト配列を変換する必要がある場合は、たとえばa のDataInputStream
周りに aを使用することをお勧めします)。ByteArrayInputStream
編集: エンディアンを変更する必要がある場合は、DataInput がエンディアンの変更をサポートしていないため、ByteBuffer を使用するか、自分でバイトを逆にするか、自分で変換する必要があります。
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 などになります。読み取りが完了するまでブロックしますlotOfbytes
。
ストリームが停止する (接続が切断される) とEOFException
、-1 の代わりに取得されるため、-1 を取得すると、int は実際には -1 でした。
バイトをまったく解析したくない場合は、skip() できます。1 バイトを 2 つの異なる方法で解析することは DataInputStream では不可能ですが (つまり、最初にバイト 0 から 3 までの int を読み取り、次にバイト 2 から 5 までを 1 つ読み取ります)、通常はどちらも必要ありません。
例:
// 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.
これがあなたの追加の質問に答えることを願っています.