/// <summary> /// Find all markers in the datagram /// </summary> /// <param name="data"></param> /// <param name="markers"></param> /// <returns></returns> private static FoundMarker FindDatagramMarker(IEnumerable <byte> data, IEnumerable <Tuple <byte[], Marker> > markers) { var patternMatchResults = new List <FoundMarker>(); var aCollection = data as byte[] ?? data.ToArray(); var firstOffset = 0; foreach (var marker in markers) { var offset = marker.Item2.OffsetInStream; var result = PatternMatch <byte> .MatchOrMatchPartiallyAtEnd(aCollection, marker.Item1, firstOffset + offset); if (!result.NoMatch) { if (!patternMatchResults.Any()) { firstOffset = result.MatchPos - offset; } patternMatchResults.Add(new FoundMarker(marker.Item1, result, marker.Item2)); } else { break; //if we have no marker, then } } if (patternMatchResults.Count == 0) { return(null); } if (patternMatchResults.Count > 1) { // sort results: first the full matches then the partial matches, then by position patternMatchResults.Sort((m1, m2) => { if (m1.Result.FullMatch && !m2.Result.FullMatch) { return(-1); } if (m2.Result.FullMatch && !m1.Result.FullMatch) { return(1); } return(m1.Result.MatchPos - m2.Result.MatchPos); }); } return(patternMatchResults.First()); }