2013-08-01 5 views
4

, поэтому я анализирую значение KNOWN байтов. Однако первые два байта представляют собой некоторое число, затем следующее представляет собой число, которое является только одним байтом, но тогда, возможно, следующие четыре все представляют одно большое число. Есть ли лучший способ проанализировать данные, отличные от того, каким я есть.Анализ байт Java Эффективно

switch (i) { 
      //Status 
      case 2: 
       temp[3] = bytes[i]; 
       break; 
      case 3: 
       temp[2] = bytes[i]; 
       ret.put("Status", byteArrayToInt(temp).toString()); 
       break; 
      //Voltage 
      case 4: 
       temp[3] = bytes[i]; 
       break; 
      case 5: 
       temp[2] = bytes[i]; 
       ret.put("Voltage", byteArrayToInt(temp).toString()); 
       break; 
      //Lowest Device Signal 
      case 6: 
       temp[3] = bytes[i]; 
       break; 
      case 7: 
       temp[2] = bytes[i]; 
       ret.put("Lowest Device Signal", byteArrayToInt(temp).toString()); 
       clearBytes(temp); 
       break; 

}

Я перекручивание через массив байтов и у меня есть переключатель, который знает, какие байты идут в какое место, например, я знаю, что 2-й и третий байты идут к коду состояния. Поэтому я беру их и объединяю их в int. массив байтов temp является байтом [] temp = новый байт [4]. Любой лучший способ сделать это?

+0

Вы можете сделать это по-своему, с помощью специального кода или попытаться использовать какой-то общий парсер. Если он не будет намного сложнее, чем указано выше, и вы не будете его много менять, то вышеупомянутый ad-hoc подход, вероятно, проще, чем выяснение более общей схемы. –

+0

Являются ли значения 'i' считаны из самого байта []? Можете ли вы предоставить дополнительную информацию для структуры данных? –

+0

Создание строк и перенос их на карту намного дороже, чем ваш синтаксический анализ. Возможно, целых 10 раз. Я бы позаботился о том, чтобы избежать создания объекта или настройки карты в первую очередь. –

ответ

6

ByteBuffer может справиться с этим.

byte[] somebytes = { 1, 5, 5, 0, 1, 0, 5 }; 
ByteBuffer bb = ByteBuffer.wrap(somebytes); 
int first = bb.getShort(); //pull off a 16 bit short (1, 5) 
int second = bb.get(); //pull off the next byte (5) 
int third = bb.getInt(); //pull off the next 32 bit int (0, 1, 0, 5) 
System.out.println(first + " " + second + " " + third); 

Output 
261 5 65541 

Вы также можете снять произвольное число байтов с использованием метода get(byte[] dst, int offset, int length), а затем преобразовать массив байтов в какой тип данных вам нужно.

+0

+1 Я бы продолжал читать, пока у вас не будет всех байтов, которые вы ожидаете получить –

+0

Я не получаю правильные значения, поскольку я был с моим старым способом ... не уверен, что происходит. \t \t 'parsedData.put (« Статус », статус); \t \t parsedData.put ("Напряжение", String.valueOf (buffer.getShort())); \t \t parsedData.put («Самый низкий сигнал устройства», String.valueOf (buffer.getShort())); \t \t parsedData.put («Самый низкий адрес сигнала устройства», String.valueOf (buffer.get()); ' –

+0

Вам также может потребоваться пропустить первые 2 байта, вызвав buffer.getShort() один раз перед получением статуса ». Напомним, что ваши случаи переключения начинаются с индекса массива 2, а не 0. – Syon

5

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

Но в приведенном ниже примере кода я буду использовать ваше описание «Однако первые два байта представляют собой некоторое число, а затем следующее число представляет собой число, состоящее только из одного байта, но, возможно, следующие четыре представляют одно число»,

DataInputStream in = new DataInputStream(new ByteArrayInputStream(bytes)); 

//the first two bytes represent some number 
ret.put("first", Short.toString(in.readShort())); 
//next one represents a number that's only one byte 
ret.put("second", Byte.toString(in.readByte())); 
//next four all represent one number 
ret.put("Lowest Device Signal", Integer.toString(in.readInt())); 
+0

Я читаю с BluetoothSocket, и иногда я читаю 4 байта, а иногда и 3 байта, я только вставил первые 7 случаев. (Есть 58 случаев) –

+0

Это все равно будет работать примерно так же, просто вызовите соответствующий метод readXXX() в каждом из ваших случаев. – dkatzel

+0

@ user2635648 расширьте DataInputStream и добавьте методы readStatus(), readVoltage() и, наконец, readRecord() или все, что это весь блок данных, которые вы читаете –

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