我正在创建一个小型TFTP客户端 开发服务器的服务器应用程序 使用c ++和客户端使用java。
这里我发送“块计数”值
使用htons
转化。
但我无法将其转换回来 在客户端的原始价值。
例如,如果发送块计数
从服务器到ntohs(01)
(2个字节)
客户。客户端以字节为单位读取。
我收到的值是字节0
和字节1。
如果有人可以提供 溶液
答案 0 :(得分:3)
我认为你的意思是你使用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
来读取和写入数据
答案 1 :(得分:1)
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();
}
答案 2 :(得分:0)
内部的Java数字始终按网络字节顺序排列,即使在本机整数/双精度数不存在的系统上也是如此。这意味着您可以将任何进入Java的数字转换为执行此类转换的任何基本输入流 - 实现java.io.DataInput。如果您使用的是java.nio.Channel,ByteBuffer也可以工作,但您可以更改字节顺序(ByteBuffer.order()
),尽管默认情况下网络字节排序和Java内部存储是正确的。
顺便说一句,我认为您的意思是使用htons
,但在示例中您显示的是ntohs
。从C ++发送您要将 h ost order转换为 n etwork order。从Java(或任何客户端)接收服务器将使用ntohs
转换回来。