Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.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套接字服务器向C套接字客户端接收数据时出错_Java_C_Sockets - Fatal编程技术网

从Java套接字服务器向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

我的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(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),正如您在中所看到的,您的意思是发送方确实发送了一个包含十六进制表示的字符串吗?在这种情况下,您应该将字符串转换为整数,而不是相反。谢谢您的解决方案。打印格式是解决我们问题的线索。