2015-01-05 4 views
0

У меня возникла проблема и попытался найти решение в сети, но не смог получить точное или подобное решение. Проблема: я получаю пакет данных в сокете (конечно, будет читаться как byte []), и теперь я хочу проанализировать этот пакет. Начальный два байта являются целыми (тип), следующий два байта снова являются целыми (длина полезной нагрузки), а затем данные полезной нагрузки 32 байт и следующий 4 байта являются CRC. Проблема здесь в том, что я не могу получить правильный метод для анализа пакета данных, так что я получаю тип, длину полезной нагрузки. Если я узнаю способ чтения байта в правильный формат, я также могу прочитать данные полезной нагрузки. Поэтому любой может предложить, как читать байт [] в правильный тип. Заранее спасибо.Пакет Обобщение байтов в java

формата пакет данных полезной нагрузки (частичный) -

Len Тип

2B Беззнакового Короткий
2B Беззнаковых Короткие
2B Беззнакового Короткие
2B Беззнакового Короткие
2B Беззнакового Краткого
4B Подпись Долгосрочные
4B Долгосрочные
4B Долгосрочные
4B Подпись длинная

+2

Это зависит от формата или кодировки данных. Например, это XDR или другая кодировка? Это не отвечает на вопросы без дополнительной информации. Кстати: почему существует длина полезной нагрузки, если полезная нагрузка составляет 32 байта? –

+0

@Mark: полезная нагрузка может быть переменной длины, поэтому есть поле, в котором указывается длина полезной нагрузки. Но это не должно быть препятствием. Порядок байтов является большим аргументом. – Reader

+0

@ug_ С учетом дополнительной информации, я предлагаю вам восстановить ваш ответ –

ответ

0

Вы можете использовать DataInputStream. Однако вы должны тщательно изучить каждый метод, как вы его используете. В Java целые числа составляют 4 байта, шорты - 2. Поэтому, когда вы говорите, что прочитайте 2 байта как целое число, которое будет readShort(), тогда вы можете применить его к целому числу.

byte [] buffer = new byte[1024]; 
// populate your buffer 

// you could also remove ByteArrayInputStream with the actual input stream. 
DataInputStream in = new DataInputStream(new ByteArrayInputStream(buffer)); 
int theInteger = (int)in.readShort(); // reads 2 bytes from the stream and 
             // converts them to an integer 
+0

Кастинг для 'int' здесь избыточен. – EJP

1

Если порядок байт обратный порядок байтов и нет обивка, вы можете использовать методы примитивного чтения DataInputStream «s: readShort() для данного типа; другой readShort() для длины; readFully() для полезной нагрузки; и readInt() для КПР.

+0

, как это может анализировать байты, например. начальные два байта образуют значение int. Можете ли вы привести пример кода. – Reader

+1

@Reader снова прочитает ответ, если вы используете readShort(), он точно это сделает, прочитайте следующие 2 байта как один короткий 16 бит. – eckes

+0

@Reader Я вам точно сказал, что делать. Я ожидаю, что любой компетентный программист сможет уменьшить этот ответ на рабочий код. – EJP

1

Вы можете использовать ByteBuffer похожее на DataInputStream. Он также позволяет указать порядок байтов:

// if you do not use NIO to read from socket, wrap a byte array: 
ByteBuffer bb = ByteBuffer.wrap(bytes); 
bb.order(ByteOrder.BIG_ENDIAN); 
short short1 = bb.getShort(); 
short short2 = bb.getShort(); 
long long1 = bb.getLong(); 
+0

Я не пытался разобраться в описании вашего формата. Если вы укажете ее как таблицу, ее будет легче читать. Но я думаю, что пример кода будет достаточным, чтобы понять базовый шаблон для использования. В java есть btw no unsigned types, вам нужно будет использовать подписанные для чтения, а затем обрабатывать результат как unsigned (или маскировать его на более крупные типы). – eckes

Смежные вопросы