c++;服务器htons到java ntohs客户端转换

c++;服务器htons到java ntohs客户端转换,java,c++,data-conversion,htonl,Java,C++,Data Conversion,Htonl,我正在创建一个小型TFTP客户端 开发服务器的服务器应用程序 使用C++和客户端使用java 这里我发送“块计数”值 使用htons转换 但是我不能把它转换回来 以其在客户处的原始价值 例如,如果我正在发送块计数 ntohs(01)(2字节)从服务器到 客户客户端正在读取字节数。 我正在接收的值是字节0 和字节1 如果有人能提供 解决方案。我认为您的意思是使用ntohs对从网络读取的值进行解码,并使用htons对通过网络发送的值进行编码 与…协调一致地调查。网络字节顺序为big-endian,因

我正在创建一个小型TFTP客户端 开发服务器的服务器应用程序 使用C++和客户端使用java 这里我发送“块计数”值 使用
htons
转换

但是我不能把它转换回来 以其在客户处的原始价值

例如,如果我正在发送块计数
ntohs(01)
(2字节)从服务器到 客户客户端正在读取字节数。 我正在接收的值是字节0 和字节1

如果有人能提供
解决方案。

我认为您的意思是使用
ntohs
对从网络读取的值进行解码,并使用
htons
对通过网络发送的值进行编码

与…协调一致地调查。网络字节顺序为big-endian,因此请使用该值正确配置
ByteBuffer
。请注意,
BIG_ENDIAN
是默认顺序,但在这种情况下,最好明确说明您的偏好



您没有提到在Java中使用什么进行网络通信。如果它是
java.net.Socket
,您可以调用
Socket#getChannel()
来获取
java.nio.channels.SocketChannel
,它是
java.nio.channels.ByteChannel
的子类型,您可以使用
ByteBuffer
来读写数据。

java内部的数字总是按网络字节顺序排列的,即使在不使用本机整数/双精度的系统上。这意味着您可以使用实现Java.io.DataInput的任何基本输入流来转换任何传入Java的数字。如果您使用的是java.nio.Channel,则ByteBuffer也可以工作,但是您可以在那里更改endianness(
ByteBuffer.order()
),尽管默认值对于网络字节排序和java内部存储是正确的

顺便说一句,我想您的意思是使用
htons
,但在示例中,您显示了
ntohs
。从C++发送你想要把主机命令转换成网络命令。从Java(或任何客户端)接收数据时,服务器将使用
ntohs
转换回

   private void somemethod(){

    byte[] fileDataFull = new byte[516];
    byte[] receivedCounter = new byte[2];

    readLength = in.read(fileDataFull);

    receivedCounter[0] = fileDataFull[2];
    receivedCounter[1] = fileDataFull[3];

   if (expectedPktCount == convertntohs(receivedCounter)){

   }

   byte[] b = converthtons((short) expectedPktCount);

}

    private short convertntohs(byte[] value) {
        ByteBuffer buf = ByteBuffer.wrap(value);
        return buf.getShort();
    }

    private byte[] converthtons(short sValue) {
        byte[] baValue = new byte[2];
        ByteBuffer buf = ByteBuffer.wrap(baValue);
        return buf.putShort(sValue).array();
    }