2010-11-02 65 views
1

我在我的java項目中使用了TCP套接字。我正嘗試從某些設備接收數據。當設備從0x80發送數據到0x9f時,數據會被破壞。例如,如果設備發送0x86(十進制134),我得到0x2020(十進制8224)。請在下面找到示例代碼給出錯誤值的TCP套接字

BufferedReader in = new BufferedReader(
        new InputStreamReader(
        socket.getInputStream())); 

      int res = in.read() ; 

請讓我知道,如果有人遇到這樣的問題。 任何幫助是高度讚賞。

AJ

回答

2

您使用InputStreamReader,這是在使用默認的字符編碼平臺反過來,因爲你沒有指定的編碼。 不要這樣做。

你真的想要發送和接收文本嗎?如果是這樣,明確地在兩邊使用相同的編碼(並確保它覆蓋了所有要傳輸的文本 - UTF-8通常是一個不錯的選擇)。如果沒有,請不要使用Writer/Reader對 - 它們用於文本數據。

2

InputStreamReader讀取字節並將它們轉換爲字符(通常使用UTF-8,除非另有指定)。而UTF-8表示值超過127的字節是多字節字符的一部分,所以它們可以與下一個字節組合,並給你一個奇怪的字符代碼。其他編碼可以做類似的古怪事情,假設您的字節表示在編碼的字符集中定義的字符。

修復:如果您正在讀取字節,請讀取字節(通過InputStream)。如果你正在閱讀字符,請閱讀chars(通過閱讀器)。永遠不要混淆兩者。

+0

他的平臺實際上使用ISO-8859-1。特定的字節範圍(0x80 - 0x9F)直接與ISO-8859-1中未使用的字符代碼塊一致。 – JeremyP 2010-11-02 14:27:21

+0

啊。我想這比在0(或別的什麼)和159之間的範圍更有意義。但是,爲什麼有一個代碼被返回呢?我認爲它會拋出一個異常,或者至少返回一些「無效字符」代碼。 – cHao 2010-11-02 14:57:17