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);
    }
}

它首先读取三个字节,这应该总是可能的(对于其他更短的消息也应该不会阻塞)。