繁体   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