代码之家  ›  专栏  ›  技术社区  ›  Zarathustra

java协议实现头长度

  •  0
  • Zarathustra  · 技术社区  · 6 年前

    如何从中读取以下数据 InputStream 在Java中?或者,如何正确计算给定标题的长度?

    enter image description here

    header[0] =1和 header[1] = -7. header[] 是一个 byte 大堆

    int length = (header[0] & 0xFF) + (header[1] & 0xFF);
    

    在上述示例中 length 可能是 250

    1 回复  |  直到 6 年前
        1
  •  1
  •   Joop Eggen    6 年前

    有一种不规则的情况是,两个字节数字的尾数(最高有效字节)都是相反的: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);
        }
    }
    

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