Страницы

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

воскресенье, 9 февраля 2020 г.

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

#c_sharp #массивы


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);
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}


Сейчас использую что то типо этого. Неудобно
    


Ответы

Ответ 1



Думаю, вам нужно что-то такое: 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);

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

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