【问题标题】: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.SocketChannel,java.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 转换回来。