Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java TCP/IP客户端错误读取inputstream字节数组_Java_Tcp_Client - Fatal编程技术网

Java TCP/IP客户端错误读取inputstream字节数组

Java TCP/IP客户端错误读取inputstream字节数组,java,tcp,client,Java,Tcp,Client,我正在创建一个Java客户端程序,它向服务器发送一个命令,服务器返回一个确认和一个响应字符串 响应以这种方式发回 client -> server : cmd_string server -> client : ack_msg(06) server -> client : response_msg 客户端代码 公共静态void readStream(InputStream in){ 问题:我读取的最后一个值不正确,我已使用wireshark验证服务器是否已将响应作为06

我正在创建一个Java客户端程序,它向服务器发送一个命令,服务器返回一个确认和一个响应字符串

响应以这种方式发回

client -> server : cmd_string

server -> client : ack_msg(06)

server -> client : response_msg
客户端代码

公共静态void readStream(InputStream in){

问题:我读取的最后一个值不正确,我已使用wireshark验证服务器是否已将响应作为06 02 b3 43发回 4f b3 30 b3 03 8c

我如何正确读取中的最后一个值。读取流是否存在问题

编辑

响应的其余部分读取正确,但最后一个字符应为8c,但读取为0152Hex

来自服务器的响应:06 02 b3 43 4f b3 30 b3 03 8c

按程序读取:[0006,0002,00b3,0043,004f,00b3,0030,00b3,0003,0152]

读取最后一个字符时出现问题

编辑2

响应作为2个数据包/流接收

packet 1 byte arr :  6 (ACK)

packet 2 byte arr:  2 -77 67 79 -77 48 -77 3 -116 (response)
  dec: 6 2 179 67 79 179 48 179 3 338
  hex: [0006, 0002, 00b3, 0043, 004f, 00b3, 0030, 00b3, 0003, 0152]
客户读取的完整响应

packet 1 byte arr :  6 (ACK)

packet 2 byte arr:  2 -77 67 79 -77 48 -77 3 -116 (response)
  dec: 6 2 179 67 79 179 48 179 3 338
  hex: [0006, 0002, 00b3, 0043, 004f, 00b3, 0030, 00b3, 0003, 0152]

感谢这个问题的问题是有符号的变量与无符号的变量之间的问题。当计算机内存中有一个数字时,它由一组位表示,每个位都是0或1。字节通常是8位,短字符是16位等。在无符号的数字中,8位将得到from正0到255,但不到负数

这就是有符号
数字的位置。在有符号数字中,第一位告诉您以下位是表示负值还是正值。因此,现在您可以使用8位来表示-128到+127。(请注意,正范围从255到127减半,因为您“牺牲”了一半范围到负数)

那么现在,如果您将有符号的
转换为无符号的
,会发生什么情况呢?根据您的操作方式,事情可能会出错。在上面的问题中,代码
char c=(char)b;
将有符号的
字节转换为无符号的
字符。正确的方法是“使您的字节无符号”在将其转换为字符之前。您可以这样做:
charc=(char)(b&0xFF);

基本上,您只需记住,除了char之外,所有java数字都是有符号的,您所需要做的就是粘贴
&0xFF
使其工作一个字节,
0xFFFF
使其短时间工作,等等

有关此操作的详细信息如下。调用&意味着a,
0xFF
是255的十六进制。255高于有符号字节(127)的限制,因此数字
b&0xFF
被java升级为short。但是,短符号位位于第16位,而字节符号位位于第8位。因此,现在字节符号位成为short中的正常“数据”位,因此字节符号基本上被丢弃


如果您进行普通的转换,java会意识到像上面这样进行直接位转换将意味着您丢失符号,java希望您不喜欢这样(至少,这是我的假设),所以它为您保留了符号。因此,如果这不是您想要的,您可以显式地告诉java该怎么做。

您是否尝试过直接检查字节读,而不转换为字符串并返回?可能只是编码问题。@Henkdeber我也发布了字节数组。在8位算术中,十六进制8C和十进制-116是相同的值。所以你读取了正确的值,但只是将其转换为错误的表示形式。@DavidSchwartz你能解释一下我应该如何转换吗?我对这些概念还不熟悉。@Rachitanda不清楚你想做什么。而且,你的代码无法生成你显示的输出。因此我很难确切地说出问题所在。但首先,请停止转换插入或通过有符号类型插入。