从Java套接字服务器向C套接字客户端接收数据时出错
我的Socket客户端是用C编写的,并按以下格式发送值:从Java套接字服务器向C套接字客户端接收数据时出错,java,c,sockets,Java,C,Sockets,我的Socket客户端是用C编写的,并按以下格式发送值: x00\x2C\x02\x00\xE0\x00 现在我想从用Java编写的TCP/IP套接字服务器读取十六进制值 在Java套接字中读取流值的方法应该是什么 我试图以以下方式阅读,但它不起作用: InputStream ins = sock.getInputStream(); int byteRead; while((byteRead = ins.read()) != -1) { System.out.println(Intege
x00\x2C\x02\x00\xE0\x00
现在我想从用Java编写的TCP/IP套接字服务器读取十六进制值
在Java套接字中读取流值的方法应该是什么
我试图以以下方式阅读,但它不起作用:
InputStream ins = sock.getInputStream();
int byteRead;
while((byteRead = ins.read()) != -1) {
System.out.println(Integer.toHexString(byteRead & 0xFF));
}
如果您不知道消息的长度,则需要将每个字节重新表示读入字符串缓冲区,并使用它生成一个带符号的字节[-127127] 如果您知道客户端发送的整个字符串的长度,您可以读取所有字符串,然后使用一个分隔符来读取它,在您的示例中,这个分隔符似乎是
\x
。再次使用Byte#parseByte(缓冲区,16)
进行转换
如果需要无符号的值[0255],则必须使用。首先说明明显的,“\x41”是一个带有十六进制41的字节,也称为ASCII“A”。C字符串后面还有一个终止的
\x00
。
那么你在写作
\x00\x2C\x02\x00\xE0\x00
作为大小为6的字符数组。将其写入字符串将写入空字符串,因为第一个字节是\x00
在java方面,\x00
没有问题,它只是一个普通的字节/字符
java代码还可以。一种变化可能是:
try (InputStream ins = new BufferedInputStream(sock.getInputStream())) {
int byteRead;
while ((byteRead = ins.read()) != -1) {
System.out.printf("%02X%n", byteRead & 0xFF);
}
} // Closes
在这里,大写X导致大写十六进制,而%n导致换行<代码>字符串。可选择格式
我的第一个猜测是,C编写错误地使用了
put
,使用了strlen
左右。看看Socket
输入(和输出)流。在网络上传输的数据总是二进制的,所以它只取决于你在接收端如何解释它。试着按照原始帖子所示阅读。下面的格式就是字面上的“格式”。数据仍然是二进制的。它是六个字节,值0x002C0200E000。
您可以使用DataInputStream.readShort()/.readInt()
读取它。您可以使用Integer.parseInt(hexString,16),正如您在中所看到的,您的意思是发送方确实发送了一个包含十六进制表示的字符串吗?在这种情况下,您应该将字符串转换为整数,而不是相反。谢谢您的解决方案。打印格式是解决我们问题的线索。