2010-11-02 64 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