Нахождение значения 2 байта в Java - PullRequest
3 голосов
/ 04 июня 2010

Я пытаюсь найти значение первых 2 байтов в пакете UDP, которое соответствует длине оставшейся полезной нагрузки. Каков наилучший способ найти это значение в Java, если я знаю первые 2 байта? java.nio.ByteBuffer пригодится?

Спасибо

Ответы [ 4 ]

5 голосов
/ 04 июня 2010

Я обычно использую что-то вроде этого:

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, потому что также short тип данных (как и все) подписан в Java, поэтому вам нужно больше места.

3 голосов
/ 04 июня 2010

Использовать ByteBuffer удобно, только не запутайтесь в 16-битных значениях со знаком Java:

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;
2 голосов
/ 04 июня 2010

Вы действительно можете использовать 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.
1 голос
/ 04 июня 2010

Использование ByteBuffer будет иметь значение, только если вы читаете UDP-пакеты (используя nio). Вы можете создать служебный метод:

static final int getLength(DatagramPacket packet) {
 byte data[] = DatagramPacket.getData();
 return (int)((0xFF & (int)data[0]) << 8) | (0xFF & (int)data[1]));
}
...