簡體   English   中英

從InputStreamReader讀取4個字節

[英]Reading 4 bytes from InputStreamReader

我有一個問題。 我正在Java中的一個簡單的多線程TCP服務器上工作,目前有這個問題:

客戶可以向我發送輸入字符串,例如

[IDENTIFIER]文字\\ r \\ n

沒關系,我已經完成了。 除一種情況外,每個輸入查詢都必須以\\ r \\ n結尾。

這種情況是客戶端將圖像作為二進制數據發送時。 該消息具有以下結構:

照片[空間] [數據長度] [空間] [數據] [BIG ENDIAN中的校驗和的4個字節]

關鍵是要返回一個

202 OKAY \\ r \\ n

當校驗和與數據中的位總和匹配時顯示的消息,或者...

302錯誤的支票\\ r \\ n

... 除此以外。 但是,讀取4個字節時遇到一些嚴重問題。 輸入源是InputStreamReader的實例,該實例從以下來源獲取:

in = new InputStreamReader(this.clientSocket.getInputStream());

函數InputStreamReader.read()返回一個剛剛讀取的char的int值。 現在,我試圖

            correctChecksumBytes = new byte[4];
            for( int i  = 0 ; i < 4 ; ++i ) {
                correctChecksumBytes[i] = (byte) in.read();
            }

            if (correctChecksumBytes == null)   {
                throw new BadSyntax();
            }            
            bb = ByteBuffer.wrap(correctChecksumBytes);
            bb.order(ByteOrder.BIG_ENDIAN);
            fourByteCheck = bb.getInt();

但是,我現在明白,強制轉換in.read()返回的int是錯誤的,因為結果相差很大。 我被認為是ByteBuffer的用法是正確的,我只是不知道如何用正確的值填充字節數組。

我也嘗試將InputSreamReader轉換為字節數組,但是我發現這不是有效的方法,因為出現一條消息...

照片[空格] [數據長度] [空格] [數據] [BIG ENDIAN中的校驗和的4個字節] [IDENTIFIER]文字\\ r \\ n

...有效,需要解釋為2條消息。

我做了一些測試,發現我成功地讀取了所有數據並計算了有效的校驗和,因此輸入中的下4個字節是校驗和的4個字節,但我還沒有設法讀取。

另外,這是有效的PHOTO消息的示例

照片8 ABCDEFGH \\ x00 \\ x00 \\ x02 \\ x24

因此,我想問一下,如何讀取這4個字節並將其轉換為int以與計算的校驗和進行比較?

非常感謝

InputStreamReader將讀取基於字符的數據。 您必須編寫自定義InputStream並從中讀取x字節。

暫無
暫無

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

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