java 协议实现 header 长度
java protocol implementation header length
如何从Java中的InputStream
读取以下数据?或者如何根据给定的 header?
正确计算长度
当 header[0]
= 1 并且 header[1] = -7. header[]
是一个 byte
数组时,我的实现似乎不起作用
int length = (header[0] & 0xFF) + (header[1] & 0xFF);
在上面的例子中 length
将是 250
两个双字节数字的字节顺序(最高有效字节)被颠倒是不规则的:aLength 和 crc16。我也不确定 aLength 是 n,还是 n - 2 - 7。
void read(InputStream inputStream) throws IOException {
try (DataInputStream in = new DataInputStream(inputStream)) {
byte b = in.readByte();
if (b != 0x02) {
throw new IOException("First byte must be STX");
}
int aLength = in.readUnsignedShort();
byte[] message = new byte[aLength - 3]; // aLength == n
in.readFully(message);
byte comAdr = message[0];
byte controlByte = message[1];
byte status = message[2];
byte[] data = Arrays.copyOfRange(message, 7 - 3, aLength - 2);
int crc16 = ((message[aLength - 1] << 8)
& 0xFF) | (message[aLength - 1] & 0xFF);
// Alternatively a ByteBuffer may come in handy.
int crc16 = ByteBuffer.wrap(message)
.order(ByteOrder.LITTLE_ENDIAN)
.getShort(aLength - 2) & 0xFF;
...
String s = new String(data, StandardCharsets.UTF_8);
}
}
它首先读取三个字节,这应该总是可能的(对于其他更短的消息也应该不会阻塞)。
如何从Java中的InputStream
读取以下数据?或者如何根据给定的 header?
当 header[0]
= 1 并且 header[1] = -7. header[]
是一个 byte
数组时,我的实现似乎不起作用
int length = (header[0] & 0xFF) + (header[1] & 0xFF);
在上面的例子中 length
将是 250
两个双字节数字的字节顺序(最高有效字节)被颠倒是不规则的:aLength 和 crc16。我也不确定 aLength 是 n,还是 n - 2 - 7。
void read(InputStream inputStream) throws IOException {
try (DataInputStream in = new DataInputStream(inputStream)) {
byte b = in.readByte();
if (b != 0x02) {
throw new IOException("First byte must be STX");
}
int aLength = in.readUnsignedShort();
byte[] message = new byte[aLength - 3]; // aLength == n
in.readFully(message);
byte comAdr = message[0];
byte controlByte = message[1];
byte status = message[2];
byte[] data = Arrays.copyOfRange(message, 7 - 3, aLength - 2);
int crc16 = ((message[aLength - 1] << 8)
& 0xFF) | (message[aLength - 1] & 0xFF);
// Alternatively a ByteBuffer may come in handy.
int crc16 = ByteBuffer.wrap(message)
.order(ByteOrder.LITTLE_ENDIAN)
.getShort(aLength - 2) & 0xFF;
...
String s = new String(data, StandardCharsets.UTF_8);
}
}
它首先读取三个字节,这应该总是可能的(对于其他更短的消息也应该不会阻塞)。