Goodies from here - link
static class ByteArrayRocks { static readonly int[] Empty = new int[0]; public static int[] Locate(this byte[] self, byte[] candidate) { if (IsEmptyLocate(self, candidate)) return Empty; var list = new List<int>(); for (int i = 0; i < self.Length; i++) { if (!IsMatch(self, i, candidate)) continue; list.Add(i); } return list.Count == 0 ? Empty : list.ToArray(); } static bool IsMatch(byte[] array, int position, byte[] candidate) { if (candidate.Length > (array.Length - position)) return false; for (int i = 0; i < candidate.Length; i++) if (array[position + i] != candidate[i]) return false; return true; } static bool IsEmptyLocate(byte[] array, byte[] candidate) { return array == null || candidate == null || array.Length == 0 || candidate.Length == 0 || candidate.Length > array.Length; } static void Main() { var data = new byte[] { 23, 36, 43, 76, 125, 56, 34, 234, 12, 3, 5, 76, 8, 0, 6, 125, 234, 56, 211, 122, 22, 4, 7, 89, 76, 64, 12, 3, 5, 76, 8, 0, 6, 125 }; var pattern = new byte[] { 12, 3, 5, 76, 8, 0, 6, 125 }; foreach (var position in data.Locate(pattern)) Console.WriteLine(position); } }