首页 > 解决方案 > 如果与 `read(byte[] b)` 相比,为什么 java.io.InputStream `read()` 方法输出不同的值?

问题描述

我的目标是解码客户端通过 WebSocket 连接发送到服务器的消息。帧数据有长度,更多关于基本帧协议 [RFC6455]。

我最近发现read(byte[] b)输出整个帧。

例如,当客户端向abcdef服务器发送消息时

byte[] frame = new byte[1000]
inputStream.read(frame); // [[-127, -122, -69, -122, 95, -5, -38, -28, 60, -97, -34, -32, 0, 0, ....]

但是,第一个字节应该是129,第二个字节应该是134。读取帧的唯一方法是通过循环并使用int[]而不是byte[]因为该read()方法输出int而不是字节?

int[] frame = new frame[1000];
booean close = false;

frame[0] = inputStream.read();
frame[1] = inputStream.read();

int length = frame[1] & 127;

int pointer = 2;

while (!close) {
  frame[pointer] = inputStream.read();
  if (pointer == length) {
    close = true;
  }
}

标签: javawebsocket

解决方案


-127 '是' 129,即它是 10000001,它是一个数字,取决于它是有符号的还是无符号的。

阅读什么是“2 的补码”?有关带符号二进制数格式的更多详细信息。

因此,您可以在需要时使用 byte[] 并将字节转换为 int,例如

    public static void main(String... args) {
        byte b = -127;
        int i = b & 0xff;
        System.out.println("b = " + b + " i = " + i);
    }

推荐阅读