using System.Collections;
using System.Collections.Generic;
public static void Main()
var results = new List<byte> { 0x04, 0x03, 0x04, 0x03, 0x05, 0x04, 0x04, 0x04, 0x03, 0x05 };
var pattern = new List<byte> { 0x04, 0x03, 0x04, 0x03, 0x05 };
Console.WriteLine("---MatchRepeatPattern---\n");
MatchRepeatPattern(results, pattern);
public static void MatchRepeatPattern(List<byte> results, List<byte> patterns)
bool isPatternIdentical = IsPatternIdentical(patterns);
if (!isPatternIdentical) patterns = GetUniquePattern(patterns);
int resultsLength = results.Count, patternLength = patterns.Count;
int patternIndex = 0, resultsIndex = 0, result = -1;
bool isFoundPattern = false;
while (resultsIndex < resultsLength) {
Console.WriteLine("Check Result(Index:" + resultsIndex +")-"+ results[resultsIndex] + ", Pattern(Index:" + patternIndex +")-" + patterns[patternIndex] + " = " + ((results[resultsIndex] & patterns[patternIndex]) == patterns[patternIndex]));
if (resultsIndex >= patternLength * 2 && !isFoundPattern) break;
if (CompareResult(results[resultsIndex], patterns[patternIndex])) {
if (isFoundPattern && isPatternIdentical) result++;
} else if (resultsIndex < resultsLength && !CompareResult(results[resultsIndex], patterns[patternIndex])) {
if (isFoundPattern) break;
if (patternIndex == patternLength) {
bool isFoundPatternPrefix = true;
int startIndex = resultsIndex - patternLength;
int endIndex = resultsIndex - 1;
Console.WriteLine("**Pattern matched from index " + startIndex + " to index " + endIndex);
if (!isFoundPattern && startIndex > 0) {
for (int i = 0, j = patternLength - startIndex; i < startIndex; i++, j++) {
if (!CompareResult(results[i], patterns[j])) {
Console.WriteLine("**Pattern in progress mismatch");
isFoundPatternPrefix = false;
if (!isFoundPatternPrefix) break;
isFoundPattern = isFoundPatternPrefix;
Console.WriteLine("**Pattern found until index " + result);
Console.WriteLine("**Pattern not found ");
public static bool CompareResult(int source, int target) {
return (source & target) == target;
public static bool IsPatternIdentical(List<byte> patterns) {
int sample = patterns[0];
for (int i = 1; i < patterns.Count; i++) {
if (sample != patterns[i]) return false;
public static List<byte> GetUniquePattern(List<byte> patterns)
List<byte> uniquePattern = new List<byte>();
if (patterns.Count() == 0) return uniquePattern;
uniquePattern.Add(patterns[0]);
int uniquePatternIndex = 0;
for (int i = 1; i < patterns.Count(); i++)
if (uniquePattern[uniquePatternIndex] != patterns[i])
while (uniquePattern.Count() - 1 < i)
uniquePattern.Add(patterns[uniquePattern.Count]);
if (uniquePatternIndex >= uniquePattern.Count) uniquePatternIndex = 0;
if (uniquePatternIndex != 0) uniquePattern = patterns;