Страницы

Поиск по вопросам

воскресенье, 14 апреля 2019 г.

Есть ли в c# удобная функция поиска массива байтов внутри другого массива байтов?

for (int i = 0; i < fs.Length; i++) { if (fs[i] == 64) { if (fs[i + 1] == 115) { if (fs[i + 2] == 46) { if (fs[i + 3] == 119) { if (fs[i + 4] == 104) { if (fs[i + 5] == 97) { if (fs[i + 6] == 116) { if (fs[i + 7] == 115) { if (fs[i + 8] == 97) { byte[] noom = { fs[i - 11], fs[i - 10], fs[i - 9], fs[i - 8], fs[i - 7], fs[i - 6], fs[i - 5], fs[i - 4], fs[i - 3], fs[i - 2], fs[i - 1] }; string str = Encoding.UTF8.GetString(noom, 0, noom.Length); if (Convert.ToInt64(str) > 0) { numbers.Add(str); } } } } } } } } } } }
Сейчас использую что то типо этого. Неудобно


Ответ

Думаю, вам нужно что-то такое:
var pattern = new byte[] { 64, 115, 46, 119, 104, 97, 116, 115, 97 }; const int patternOffset = 11; for (int i = patternOffset; i < fs.Length - pattern.Length; i++) { if (!fs.Skip(i).Take(pattern.Length).SequenceEqual(pattern)) continue;
var numBytes = fs.Skip(i - patternOffset).Take(patternOffset); string str = Encoding.UTF8.GetString(numBytes, 0, numBytes.Length); if (long.TryParse(str, out var num)) numbers.Add(num); }
Обратите внимание на начальный и конечный индексы в цикле for: без этой поправки вы рискуете вылететь за границы диапазона.

Как подсказывает @АндрейNOP в комментариях, можно воспользоваться более изящным
new ArraySegment(fs, i, pattern.Length).SequenceEqual(pattern)
и
var numBytes = new ArraySegment(fs, i - patternOffset, patternOffset);

Комментариев нет:

Отправить комментарий