Найти строку внутри байтового буфера - PullRequest
4 голосов
/ 28 декабря 2011

Я перехожу с C на Java.Мне интересно, как найти строку внутри байтового буфера, есть ли что-то вроде memchr в Java?Байтбуфер является только частично строкой, остальные - необработанными байтами, поэтому любой java-метод должен работать с байтами + символами.

Я также ищу что-то вроде strsep в java для разделения строк.

Ответы [ 5 ]

5 голосов
/ 28 декабря 2011

Вы можете преобразовать ByteBuffer в String и использовать indexOf, который может сработать.

ByteBuffer bb = /* non-direct byte buffer */
String text = new String(bb.array(), 0, bb.position(), bb.remaing());
int index = text.indexOf(searchText);

Это имеет нетривиальные издержки, поскольку создает строку. Альтернативой является перебор строки методом грубой силы, который будет быстрее, но на это потребуется время.

4 голосов
/ 28 декабря 2011

Вам необходимо закодировать строку символов в байты, используя правильную кодировку символов для вашего приложения.Затем используйте алгоритм поиска строк, такой как Рабин-Карп или Бойер-Мур, чтобы найти результирующую последовательность байтов в буфере.Или, если ваши буферы маленькие, вы можете просто выполнить поиск грубой силы.

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

1 голос
/ 01 марта 2015

С Самый быстрый способ найти строку в текстовом файле с помощью Java :

Лучшая реализация, которую я нашел в MIMEParser: https://github.com/samskivert/ikvm-openjdk/blob/master/build/linux-amd64/impsrc/com/sun/xml/internal/org/jvnet/mimepull/MIMEParser.java

/**
  * Finds the boundary in the given buffer using Boyer-Moore algo.
  * Copied from java.util.regex.Pattern.java
  *
  * @param mybuf boundary to be searched in this mybuf
  * @param off start index in mybuf
  * @param len number of bytes in mybuf
  *
  * @return -1 if there is no match or index where the match starts
  */

  private int match(byte[] mybuf, int off, int len) {

Также необходимо:

  private void compileBoundaryPattern();
0 голосов
/ 28 декабря 2011

Один из вариантов - использовать StringTokenizer, который может разбить строку на итеративную коллекцию токенов в соответствии с заданным разделителем (ями). Коллекция токенов может содержать разделитель при необходимости. Пример:

String s = "abc:def-ghi|jkl";
StringTokenizer tokenizer = new StringTokenizer(s, ":-|");
while (tokenizer.hasMoreTokens()) {
  System.out.print(tokenizer.nextToken());
}

Ожидаемый результат:

ABCDEFGHIJKL

0 голосов
/ 28 декабря 2011

Класс String имеет хороший метод split String.split

...