Как найти начальный индекс строки в байтовом массиве UTF-8? (С #) - PullRequest
2 голосов
/ 22 октября 2010

У меня есть массив байтов UTF-8.Я хотел бы найти конкретную строку в массиве байтов в C #.

byte[] dataArray = (some UTF-8 byte array of data);

string searchString = "Hello";

Как мне найти первое вхождениеслово "Hello" в массиве dataArray и возвращает индексное место, где начинается строка (где 'H' из 'Hello' будет находиться в dataArray)?

Ранее я ошибочно использовал что-то вроде:

int helloIndex = Encoding.UTF8.GetString(dataArray).IndexOf("Hello");

Очевидно, что этот код не будет гарантированно работать, так как я возвращаю индекс String, а не индекс байтового массива UTF-8.Существуют ли какие-либо встроенные методы C # или проверенный эффективный код, который я могу использовать повторно?

Спасибо,

Matt

Ответы [ 2 ]

4 голосов
/ 22 октября 2010

Одной из приятных особенностей UTF-8 является то, что если последовательность байтов представляет символ и эта последовательность байтов появляется где-либо в допустимых данных в кодировке UTF-8, то она всегда представляет этот символ.

Зная это, вы можете преобразовать искомую строку в байтовый массив, а затем использовать алгоритм поиска строки Бойера-Мура (или любой другой алгоритм поиска строки, который вам подходит), слегка адаптированный для работы байтовые массивы вместо строк.

Есть несколько ответов, которые могут вам помочь:

1 голос
/ 22 октября 2010

Попробуйте следующий фрагмент:

// Setup our little test.

string sourceText = "ʤhello";

byte[] searchBytes = Encoding.UTF8.GetBytes(sourceText);

// Convert the bytes into a string we can search in.

string searchText = Encoding.UTF8.GetString(searchBytes);

int position = searchText.IndexOf("hello");

// Get all text that is before the position we found.

string before = searchText.Substring(0, position);

// The length of the encoded bytes is the actual number of UTF8 bytes
// instead of the position.

int bytesBefore = Encoding.UTF8.GetBytes(before).Length;

// This outputs Position is 1 and before is 2.

Console.WriteLine("Position is {0} and before is {1}", position, bytesBefore);
...