我正在尝试查找UDP数据包中前两个字节的值,该值对应于剩余有效载荷的长度。如果我知道前两个字节,那么在Java中查找此值的最佳方法是什么?
谢谢
java.nio.ByteBuffer
有用吗?谢谢
我通常使用这样的代码:
static public int buildShort(byte high, byte low)
{
return ((0xFF & (int) high) * 256) + ((0xFF & (int) low));
}
然后你需要取出 DatagramPacket
的前两个字节:
int length = buildShort(packet.getData()[0], packet.getData()[1]);
int
,因为在Java中,short
数据类型(像所有人一样)也是有符号的,所以你需要更大的空间。ByteBuffer
很方便,只是不要被Java有符号的16位值所困扰:byte[] data = new byte[MAX_LEN];
ByteBuffer buf = ByteBuffer.wrap(data);
DatagramPacket pkt = new DatagramPacket(data, data.length);
⋮
while (connected) {
socket.receive(pkt);
int len = buf.getShort() & 0xFFFF;
⋮
}
ByteBuffer
,转换仍然相当容易。可以使用等价的乘法和加法,但是我经常看到使用位运算符:int len = (data[0] & 0xFF) << 8 | data[1] & 0xFF;
你确实可以利用java.nio.ByteBuffer
。以下是一个简单的示例:
ByteBuffer buffer = ByteBuffer.allocate(2);
buffer.order(ByteOrder.LITTLE_ENDIAN);
buffer.put(byte1);
buffer.put(byte2);
int length = buffer.getShort(0) & 0xFFFF; // Get rid of sign.
((int)buffer.getShort(0)) | 0xFFFF
)。 - Justin如果你正在使用nio读取UDP数据包,那么使用ByteBuffer才有价值。你可以创建一个实用方法:
static final int getLength(DatagramPacket packet) {
byte data[] = DatagramPacket.getData();
return (int)((0xFF & (int)data[0]) << 8) | (0xFF & (int)data[1]));
}
(int)
强制转换都是多余的。否则,这是一种可行的方法。 - Alexander Pogrebnyak