从InputStreamReader读取4个字节

时间:2015-04-01 17:07:35

标签: java byte checksum

我遇到了问题。我正在使用Java编写一个简单的多线程TCP服务器,我目前遇到了这个问题:

客户端可以向我发送输入字符串,例如

[IDENTIFIER] text \ r \ n

这没关系,我完成了。每个输入查询都需要以 \ r \ n 结束,但有一种情况除外。

这种情况是客户端将图像作为二进制数据发送。此消息具有以下结构:

PHOTO [空格] [数据长度] [空格] [数据] [BIG ENDIAN中校验和的4个字节]

并且重点是要么返回

202 OKAY \ r \ n

校验和与数据中的位总和匹配时的

消息,或者......

302 BAD CHECKSUM \ 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转换为字节数组,但我发现它不是一种有效的方法,因为消息......

PHOTO [空格] [数据长度] [空格] [数据] [BIG ENDIAN中4个字节的校验和] [IDENTIFIER] text \ r \ n

...有效,需要解释为2条消息。

我做了一些测试,发现我成功地设法读取了所有数据并计算了有效的校验和,因此输入中接下来的4个字节是校验和的4个字节,我还没有设法读取。

此外,这是一个有效的PHOTO消息的例子

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

所以我想问一下,如何读取这4个字节并将它们转换为int以与计算的校验和进行比较?

非常感谢

1 个答案:

答案 0 :(得分:0)

InputStreamReader将读取基于字符的数据。您必须编写自定义InputStream并从中读取x个字节。