我的Socket客户端是用C语言编写的,并以下面的格式发送值:
x00\x2C\x02\x00\xE0\x00
现在我想读取用Java编写的TCP / IP套接字服务器的十六进制值。
在Java Socket中读取流值的方法应该是什么?
我尝试按以下方式阅读,但它不起作用:
InputStream ins = sock.getInputStream();
int byteRead;
while((byteRead = ins.read()) != -1) {
System.out.println(Integer.toHexString(byteRead & 0xFF));
}
答案 0 :(得分:0)
如果您不知道消息的长度,则需要将每个字节重复读取到字符串缓冲区中,并使用Byte#parseByte(buffer, 16)创建签名字节 [ - 127, 127] 出来。
如果您知道客户端发送的整个String的长度,您可以全部读取它,然后String#split(regex)使用一个似乎在您的\x
中的分隔符。并再次使用Byte#parseByte(buffer, 16)
进行转换。
如果您需要无符号值 [0,255] ,则必须使用Integer.html#parseInt(buffer, 16)。
答案 1 :(得分:0)
首先说明显而易见的,“\ x41”是一个字节,带有十六进制41,即ASCII'A'。 C字符串后面还有一个终止\x00
。
所以你在写
\x00\x2C\x02\x00\xE0\x00
作为大小为6的char数组。将其写为字符串将写入一个空字符串,因为第一个字节是\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导致换行符。 String.format
可以替代。
我的第一个猜测是使用puts
左右使用strlen
错误地完成了C写作。