Я пытаюсь создать клиентский сервер UDP. Я уже мог читать сообщения, выполнив следующие действия:Java-объект для UDP-байта []
Моя входящее сообщение BIG_ENDIAN и структура такова:
UINT8 type;
UINT8 flags;
UINT16 len;
UINT32 sequenceN;
UINT16 startIdx;
UINT16 endIdx;
Соответствующие Java объекты:
short type;
short flags;
int len;
long sequenceN;
int startIdx;
int endIdx;
Для преобразования от UDP до Java Я использую следующее:
typeArray = Arrays.copyOfRange(msg, 0, 1);
type = Util.reassembleShort(typeArray);
flagsArray = Arrays.copyOfRange(msg, 1, 2);
flags = Util.reassembleShort(flagsArray);
lenArray = Arrays.copyOfRange(msg, 2, 4);
len = Util.reassembleInt(lenArray);
seqArray = Arrays.copyOfRange(msg, 4, 8);
sequenceN = Util.reassembleLong(seqArray);
startArray = Arrays.copyOfRange(msg, 8, 10);
startIdx = Util.reassembleInt(startArray);
endArray = Arrays.copyOfRange(msg, 10, 12);
endIdx = Util.reassembleInt(endArray);
Чтобы собрать байт части массива в объекты Java Я использую следующие (AKA звонки на Util.reassemble * выше):
Короткие
ByteBuffer buffer = ByteBuffer.wrap(input);
buffer.order(ByteOrder.BIG_ENDIAN);
short result = ((short) (buffer.get() & 0xff));
Long
ByteBuffer buffer = ByteBuffer.wrap(input);
buffer.order(ByteOrder.BIG_ENDIAN);
long result = ((long) buffer.getInt() & 0xffffffffL);
Int
ByteBuffer buffer = ByteBuffer.wrap(input);
buffer.order(ByteOrder.BIG_ENDIAN);
int result = (buffer.getShort() & 0xffff);
Строка
String result = new String(removeStringGarbage(input), Charset.forName("US-ASCII"));
Это отлично работает. Мой вопрос ... как мне сделать обратное и получить объекты в правильно размерный байтовый буфер, чтобы отправить обратно на UDP?
«Для преобразования из UDP в Java я использую следующие »- почему бы не просто прочитать« ByteBuffer »вместо этого? Дешевле и читабельнее. – chrylis
Извините, забыли упомянуть переменную «msg» - это входящий байтовый буфер. – Tacitus86
Байт-буфер или 'ByteBuffer'? В последнем случае вы можете просто 'getShort()' или что угодно. – chrylis