簡體   English   中英

從 Java InputStream 讀取 31 位 Integer

[英]Reading 31 bit Integer from Java InputStream

我正在嘗試從 java 的 InputStream 中讀取 31 位長的 Integer ,但我想不出辦法。 我從 InputStream 接收四個字節,第一個字節的第一位是保留位,始終未設置 (0x0),rest 為 31 位長 integer。這是我描述的可視化:

+-+-------------+---------------+-------------------------------+
|R|                     31 bit long Integer                     |
+-+-------------------------------------------------------------+

如果您能幫助我提出解決方案,我將不勝感激。 謝謝!

我正在嘗試從 InputStream 中讀取 31 位長的 Integer

那是不可能的。

您可以讀取的最小大小是一個字節,即 8 位; 你能從中讀出的所有東西都是 8 的倍數。

並且第一個字節的第一位是一個反轉字節,它總是開始(0x0)

這句話沒有任何意義。 第一個“字節的位”不能是“反轉字節”。 鑒於位是一維概念,因此不存在“反轉位”之類的東西,而“起始”(如果有任何含義)意味着“1”而不是“0”,並且通常不會傳達位在 '0x' 語法中,它是十六進制的。

我得出結論,您一定對 API 感到困惑。

但是,為了更有幫助:如果您有 4 個字節的數據,其中包含 31 位長度的 integer,則:

  1. 您需要知道它是“大端”還是“小端”。 它將在文檔中的某個地方; 通常協議是大端的。

  2. 第一點可以很容易地被剝離或隔離,這應該會有所幫助。

假設大端:

try (InputStream raw = socket.getInputStream();
     DataInputStream data = new DataInputStream(raw)) {

  int v = data.readInt();
  boolean isolatedBit = (v >>> 31) != 0;
  v = v & 0x7FFFFFFF;
}
  1. DataInputStream具有處理業務的readInt()調用。
  2. 如果未設置“R”位,則isolatedBit將為 0,如果已設置,則為“1”。
  3. 即使設置了這個 R 東西,最后一行將確保v的值未設置該位。 因此,該數字將介於 0 和 2^31-1 之間(因此,始終為正)。

注意:對原始問題進行一些更正后,這要簡單得多:

鑒於保留位始終未設置,您可以調用int v = data.readInt() ,這是 try 塊中唯一需要的內容。 如果“保留位”始終為 1 - 您需要該& 0x7FFFFFFF來擺脫它。

暫無
暫無

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

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