簡體   English   中英

java.io.InputStream `read()` 方法與 `read(byte[] b)` 相比為什么輸出不同的值?

[英]Why java.io.InputStream `read()` method outputs different value if compared with `read(byte[] b)`?

我的目標是解碼客戶端通過 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 而不是 byte?

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM