Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.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中网络字节顺序到主机字节顺序_Java_Io_Byte_Socket.io - Fatal编程技术网

java中网络字节顺序到主机字节顺序

java中网络字节顺序到主机字节顺序,java,io,byte,socket.io,Java,Io,Byte,Socket.io,我一直在解释从C服务器到java应用程序的响应。希望C服务器以BIG_ENDIAN格式响应我的java,我的问题是如何将响应转换为整数。我正在粘贴从C服务器得到的响应,想知道如何在java中实现“be64toh”功能 来自C服务器的响应- ^@^@^@^@^@^@^@^@^@^@^@^@^@^@^在本港\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\你的名字是什么 请求已成功向我们注册,并且正在处理中 处理^ ^ ^ ^ ^

我一直在解释从C服务器到java应用程序的响应。希望C服务器以BIG_ENDIAN格式响应我的java,我的问题是如何将响应转换为
整数。我正在粘贴从C服务器得到的响应,想知道如何在java中实现“be64toh”功能

来自C服务器的响应-

^@^@^@^@^@^@^@^@^@^@^@^@^@^@^在本港\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\你的名字是什么 请求已成功向我们注册,并且正在处理中 处理^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^处理


我不知道如何解释不可读的字节,当转换为十六进制时,大多数字节都是
null
,但很少有字节像
^H
^A
等那样充满数据。。你能帮我找到这个问题的解决方案吗。

假设你有一个java.nio.SocketChannel可供读取,你可以使用ByteBuffer进行转换:

private static final int BUFFER_SIZE = 1024;

ByteBuffer readBuffer = ByteBuffer.allocate(BUFFER_SIZE).order(ByteOrder.BIG_ENDIAN);
int bytesRead = socketChannel.read(readBuffer);
readBuffer.flip();
现在,您可以从缓冲区中读取数据,例如:

int someInt = readBuffer.getInt();
long someLong = readBuffer.getLong();

假设您有一个java.nio.SocketChannel可从中读取,您可以使用ByteBuffer进行转换:

private static final int BUFFER_SIZE = 1024;

ByteBuffer readBuffer = ByteBuffer.allocate(BUFFER_SIZE).order(ByteOrder.BIG_ENDIAN);
int bytesRead = socketChannel.read(readBuffer);
readBuffer.flip();
现在,您可以从缓冲区中读取数据,例如:

int someInt = readBuffer.getInt();
long someLong = readBuffer.getLong();

+顺便说一句:ByteBuffer默认为big-endian,但最好是显式的。由于OP询问如何读取32位整数,我将添加一个
getInt()
示例。。我使用套接字、DataInputStream和DataOutputStream向C服务器应用程序发送和接收数据。下面是代码段-clientSocket=newsocket(主机名、端口);if(clientSocket!=null)System.out.println(“连接到端口>>上的本地主机”+端口);os=新的DataOutputStream(clientSocket.getOutputStream());is=新的DataInputStream(clientSocket.getInputStream());您可以使用
SocketChannel-SocketChannel=SocketChannel.connect(SocketAddress)改为。好的。。我现在将java应用程序更改为使用SocketChannel。。和Eric在上面的片段中做的一样。当我打印长变量时,它只会给我一个长数字。。不确定我缺少什么,但希望看到ASCII类型的消息,如。。707您的请求已成功向我们注册,正在处理中。谢谢您需要阅读您试图与之对话的C服务器的文档,或者对协议进行反向工程。从您发布的内容来看,数据流似乎包含一些二进制头和一些混合的二进制/文本负载。您需要使用缓冲区的各种
get…()
方法分别读取每个元素。+1顺便说一句:ByteBuffer默认为big-endian,但最好是显式的。由于OP询问如何读取32位整数,我将添加一个
getInt()
示例。。我使用套接字、DataInputStream和DataOutputStream向C服务器应用程序发送和接收数据。下面是代码段-clientSocket=newsocket(主机名、端口);if(clientSocket!=null)System.out.println(“连接到端口>>上的本地主机”+端口);os=新的DataOutputStream(clientSocket.getOutputStream());is=新的DataInputStream(clientSocket.getInputStream());您可以使用
SocketChannel-SocketChannel=SocketChannel.connect(SocketAddress)改为。好的。。我现在将java应用程序更改为使用SocketChannel。。和Eric在上面的片段中做的一样。当我打印长变量时,它只会给我一个长数字。。不确定我缺少什么,但希望看到ASCII类型的消息,如。。707您的请求已成功向我们注册,正在处理中。谢谢您需要阅读您试图与之对话的C服务器的文档,或者对协议进行反向工程。从您发布的内容来看,数据流似乎包含一些二进制头和一些混合的二进制/文本负载。您需要使用缓冲区的各种
get…()
方法分别读取每个元素。