WfcPatcher/ByteArrayRocks.cs
2014-05-29 21:03:16 +02:00

45 lines
1023 B
C#

// from http://stackoverflow.com/questions/283456/byte-array-pattern-search
using System;
using System.Collections.Generic;
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;
}
}