【问题标题】:network byte order to host byte order in javajava中网络字节顺序到主机字节顺序
【发布时间】:2012-07-17 11:46:37
【问题描述】:

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

来自 C 服务器的响应 -

^@^@^@^@^@^@^@^@^@^@^@^@^@^@^H^@^@^@^@^@^A^A^B^ @^@^@^N^@^@^@^@^@^@^@^@^@^@^@^H^@^@^@^@^@^@^@^A^@^ @^@^K^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^BÃ^@^@^@ ^A你的 请求已成功向我们注册并在 处理。^@^@^@^@^D^@^@^@^@^@^@^@¨ýf^@^@^@^@^@mX@^@^@^@^@^ @^@^@^@^N^@^@^@^@^@^@^@^@^@^@^@^H

我不确定如何解释不可读的字节,当转换为十六进制时,它们中的大多数是null,但其中很少有像^H^A 等那样填充数据。你能请帮我找到解决方案。

【问题讨论】:

    标签: java io byte socket.io


    【解决方案1】:

    假设你有一个 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();
    

    【讨论】:

    • +1 BTW:ByteBuffer 默认为大端,但最好是显式的。由于 OP 询问有关读取 32 位整数的问题,我将添加一个 getInt() 示例。
    • 您好 Erich,谢谢您的回复。我正在使用 Socket 和 DataInputStream 和 DataOutputStream 向 C 服务器应用程序发送和接收数据。下面是 sn -p - clientSocket = new Socket(hostname, port); if(clientSocket!=null) System.out.println("连接到 localhost 的端口 >>"+port); os = new DataOutputStream(clientSocket.getOutputStream()); is = new DataInputStream (clientSocket.getInputStream());
    • 您可以改用SocketChannel socketChannel = SocketChannel.connect(SocketAddress);
    • 好的..我现在将我的 java 应用程序更改为使用 SocketChannel.. 并且执行与 Eric 上述 sn-p 中相同的操作。当我打印长变量时,它只是给了我一个长数字。不确定缺少什么,但希望看到 ASCII 类型的消息,例如 707 您的请求已成功向我们注册并正在处理中。谢谢!
    • 您需要阅读您尝试与之通信的 C 服务器的文档 - 或对协议进行逆向工程。从您发布的内容来看,数据流似乎包含一些二进制标头和一些混合的二进制/文本有效负载。您需要使用缓冲区的各种get...() 方法分别读取每个元素。
    猜你喜欢
    • 1970-01-01
    • 2013-10-23
    • 1970-01-01
    • 2022-01-22
    • 2014-05-18
    • 1970-01-01
    • 2015-06-28
    • 2015-03-30
    • 1970-01-01
    相关资源
    最近更新 更多