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);
Комментариев нет:
Отправить комментарий