Разбор двоичных данных - PullRequest
       44

Разбор двоичных данных

1 голос
/ 23 сентября 2011

У меня есть приложение, которое получает данные в двоичном виде через Bluetooth. Я читаю данные с помощью inputtream из bluesosocket в байт []. Но я должен проанализировать все сообщения, потому что они должны иметь заданный формат, чтобы быть действительными. Все сообщения в двоичном формате.

Моим решением было преобразовать байт [] в строку, а затем разбить строку и проанализировать все полученные сообщения.

Пример данных для разбора: 0000000010000001

я должен знать, что первые 8 нулей - это заголовок, а 10000001 - реальные данные.

Моя идея состояла в том, чтобы создать строку (из байта []), которая представляет -> 0000000010000001 используя новую строку (byte []) а затем разбить всю строку на один байт и проверить значение, например:

строка1 имела 00000000 строка2 имела 10000001

я знаю, что 8 нулей являются заголовком, поэтому string2 имеет представление данных.

Мой вопрос касается эффективности этого метода. Это лучший способ сделать это в мобильной среде?

Ответы [ 3 ]

2 голосов
/ 24 сентября 2011

Манипулирование строками для анализа двоичных данных довольно неэффективно с точки зрения скорости, потребления памяти, а также накладывает определенную нагрузку на сборщик мусора - потому что вы всегда генерируете новые строковые объекты и сразу их забываете.

В Java у вас есть несколько вариантов сделать это лучше:

  • DataInputStream: это оболочка для InputStream, где вы читаете байты, шорты, длинные, двойные и т. Д. Прямо из потока.
  • NIO с использованием ByteBuffers и «производными» типами, такими как ShortBuffer ... они хороши для объемной передачи данных, а также для двоичного анализа.

Пока ваши данные выровнены по байтам, это простые способы. Если это не так - тогда лучше узнать, как выполнять битовые манипуляции с помощью таких операторов, как &, |, ~, <<, >>.

Я предлагаю вам придерживаться DataInputStream как можно дольше.

0 голосов
/ 11 января 2016

только для справки, есть бесплатная библиотека OSS под названием Java Binary Block Parser (JBBP) , она совместима с Android (2.1+) и позволяет просто описывать структуру данных в текстовом формате и автоматически анализировать данные поток (или массив), если вы хотите проанализировать весь поток в битах, тогда он может быть выполнен в одной строке

byte [] parsedBits = JBBPParser.prepare("bit:1 [_];").parse(new byte[]{1,2,3,4,5}).findFieldForType(JBBPFieldArrayBit.class).getArray();
0 голосов
/ 23 сентября 2011

Строки - наименее эффективный способ сделать это действительно.

Если ваш двоичный файл 0000000010000001 на самом деле byte[] {0, 0, 0, 0, 2, 0, 0, 1} в десятичном виде, просто проверьте, если b[0] == b[1] == b[3] == b[4] == 0.

Edit: Игнорировать "в десятичной" части, это не имеет значения, если вы только хотите проверить, если ваш массив начинается с 00000000 (то есть 4 нулевых байта)

...