【问题标题】:c++ server htons to java ntohs client conversionc++ 服务器 htons 到 java ntohs 客户端转换
【发布时间】:2009-11-26 00:53:15
【问题描述】:

我正在创建一个小型 TFTP 客户端 开发服务器的服务器应用程序 使用 c++ 和使用 java 的客户端。

我在这里发送“块计数”值 使用htons 转换。

但我无法将其转换回来 到客户的原始价值。

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

如果有人可以提供 解决方案。

【问题讨论】:

    标签: java c++ data-conversion htonl


    【解决方案1】:

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

    查看ByteBuffer#getShort()ByteBuffer#order(ByteOrder)网络字节顺序big endian,所以使用值ByteOrder#BIG_ENDIAN来正确配置你的ByteBuffer。请注意,BIG_ENDIAN 是默认顺序,但在这种情况下,最好明确说明您的偏好。


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

    【讨论】:

      【解决方案2】:
         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();
          }
      

      【讨论】:

        【解决方案3】:

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

        顺便说一句,我认为您的意思是使用htons,但在示例中您显示ntohs。从 C++ 发送您希望将 host 订单转换为 n 网络订单。从 Java(或任何客户端)接收您的服务器将使用 ntohs 转换回来。

        【讨论】:

          猜你喜欢
          • 2019-02-26
          • 1970-01-01
          • 2011-06-09
          • 2013-11-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多