[英]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,則:
您需要知道它是“大端”還是“小端”。 它將在文檔中的某個地方; 通常協議是大端的。
第一點可以很容易地被剝離或隔離,這應該會有所幫助。
假設大端:
try (InputStream raw = socket.getInputStream();
DataInputStream data = new DataInputStream(raw)) {
int v = data.readInt();
boolean isolatedBit = (v >>> 31) != 0;
v = v & 0x7FFFFFFF;
}
DataInputStream
具有處理業務的readInt()
調用。isolatedBit
將為 0,如果已設置,則為“1”。v
的值未設置該位。 因此,該數字將介於 0 和 2^31-1 之間(因此,始終為正)。注意:對原始問題進行一些更正后,這要簡單得多:
鑒於保留位始終未設置,您可以調用int v = data.readInt()
,這是 try 塊中唯一需要的內容。 如果“保留位”始終為 1 - 您將需要該& 0x7FFFFFFF
來擺脫它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.