Java TCP/IP客户端错误读取inputstream字节数组
我正在创建一个Java客户端程序,它向服务器发送一个命令,服务器返回一个确认和一个响应字符串 响应以这种方式发回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
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不清楚你想做什么。而且,你的代码无法生成你显示的输出。因此我很难确切地说出问题所在。但首先,请停止转换插入或通过有符号类型插入。