public FindSequenceResult FindMaxSequence() { var FindSequenceResult = new FindSequenceResult() { Offset = 0, Size = 0, }; if ((Data.Length - _Offset) >= MinSize) { fixed(byte *DataPtr = this.Data) { var Hash = GetOffsetHash(_Offset); if (Waypoints.ContainsKey(Hash)) { //var Node = Waypoints[Hash].Last; foreach (var CompareOffset in Waypoints[Hash]) { int LocalMaxSize = Math.Min((Data.Length - _Offset), MaxSize); //if (!AllowOverlapping && (CompareOffset + LocalMaxSize > _Offset)) continue; int MatchedLength = PointerUtils.FindLargestMatch( &DataPtr[CompareOffset], &DataPtr[_Offset], LocalMaxSize ); /* * var Hash1 = PointerUtils.FastHash(&DataPtr[CompareOffset], MinSize); * var Hash2 = PointerUtils.FastHash(&DataPtr[_Offset], MinSize); * for (int n = 0; n < MinSize; n++) * { * Console.WriteLine("{0:X2}, {1:X2}", DataPtr[CompareOffset + n], DataPtr[_Offset + n]); * } * Console.WriteLine(); * Console.WriteLine("{0}, {1}, {2}, {3}: {4:X8}, {5:X8}, {6:X8}", MatchedLength, MinSize, MaxSize, LocalMaxSize, Hash, Hash1, Hash2); */ //Console.WriteLine("{0}, {1}, {2}", CompareOffset - _Offset, MatchedLength, CompareOffset - _Offset + MatchedLength); if (!AllowOverlapping && (CompareOffset - _Offset + MatchedLength) > 0) { MatchedLength = _Offset - CompareOffset; //continue; } if (MatchedLength >= MinSize) { if (FindSequenceResult.Size < MatchedLength) { FindSequenceResult.Size = MatchedLength; FindSequenceResult.Offset = CompareOffset; } if (MatchedLength == MaxSize) { break; } } } } } } return(FindSequenceResult); }
public FindSequenceResult FindMaxSequence(int FindOffset, int MaxSearchOffset, int MaxDistanceFromSearchOffset = 0x1000, int MinSearchSize = 3, int MaxSearchSize = 16, bool AllowOverlapping = true) { var FindSequenceResult = new FindSequenceResult() { Offset = 0, Size = 0, }; MaxSearchSize = Math.Min(MaxSearchSize, Size - FindOffset); if (MinSearchSize < this.GlobalMinSearchSize) { throw(new Exception("Local MinSearchSize can't be lower than the GlobalMinSearchSize")); } if (MaxSearchSize < MinSearchSize) { return(FindSequenceResult); } if ((Size - FindOffset) < MinSearchSize) { return(FindSequenceResult); } var Hash = GetOffsetHash(FindOffset); if (Waypoints.ContainsKey(Hash)) { FindSequenceResult.Size = 0; //foreach (var Index in Waypoints[Hash].Where((int Index) => (Index < MaxSearchOffset))) foreach (var Index in Waypoints[Hash].LowerBound(MaxSearchOffset, false)) { if (Index < (MaxSearchOffset - MaxDistanceFromSearchOffset)) { continue; } int SequenceCount = 0; for (SequenceCount = 0; SequenceCount < MaxSearchSize; SequenceCount++) { //Console.WriteLine(this.Data[Index + SequenceCount] + "," + this.Data[FindOffset + SequenceCount]); if (this.Data[Index + SequenceCount] != this.Data[FindOffset + SequenceCount]) { break; } } if (!AllowOverlapping) { if (Index + SequenceCount > FindOffset) { SequenceCount = FindOffset - Index; } } if ((SequenceCount >= MinSearchSize) && SequenceCount >= (FindSequenceResult.Size)) { FindSequenceResult.Size = SequenceCount; FindSequenceResult.Offset = Index; if (SequenceCount > MaxSearchSize) { throw (new InvalidDataException("SequenceCount > MaxSearchSize")); } // Found an optimal sequence, stop searching. if (SequenceCount == MaxSearchSize) { break; } } } } return(FindSequenceResult); }
public FindSequenceResult FindMaxSequence(int FindOffset, int MaxSearchOffset, int MaxDistanceFromSearchOffset = 0x1000, int MinSearchSize = 3, int MaxSearchSize = 16, bool AllowOverlapping = true) { var FindSequenceResult = new FindSequenceResult() { Offset = 0, Size = 0, }; MaxSearchSize = Math.Min(MaxSearchSize, Size - FindOffset); if (MinSearchSize < this.GlobalMinSearchSize) { throw(new Exception("Local MinSearchSize can't be lower than the GlobalMinSearchSize")); } if (MaxSearchSize < MinSearchSize) { return FindSequenceResult; } if ((Size - FindOffset) < MinSearchSize) { return FindSequenceResult; } var Hash = GetOffsetHash(FindOffset); if (Waypoints.ContainsKey(Hash)) { FindSequenceResult.Size = 0; //foreach (var Index in Waypoints[Hash].Where((int Index) => (Index < MaxSearchOffset))) foreach (var Index in Waypoints[Hash].LowerBound(MaxSearchOffset, false)) { if (Index < (MaxSearchOffset - MaxDistanceFromSearchOffset)) { continue; } int SequenceCount = 0; for (SequenceCount = 0; SequenceCount < MaxSearchSize; SequenceCount++) { //Console.WriteLine(this.Data[Index + SequenceCount] + "," + this.Data[FindOffset + SequenceCount]); if (this.Data[Index + SequenceCount] != this.Data[FindOffset + SequenceCount]) break; } if (!AllowOverlapping) { if (Index + SequenceCount > FindOffset) { SequenceCount = FindOffset - Index; } } if ((SequenceCount >= MinSearchSize) && SequenceCount >= (FindSequenceResult.Size)) { FindSequenceResult.Size = SequenceCount; FindSequenceResult.Offset = Index; if (SequenceCount > MaxSearchSize) { throw (new InvalidDataException("SequenceCount > MaxSearchSize")); } // Found an optimal sequence, stop searching. if (SequenceCount == MaxSearchSize) { break; } } } } return FindSequenceResult; }
public FindSequenceResult FindMaxSequence() { var FindSequenceResult = new FindSequenceResult() { Offset = 0, Size = 0, }; if ((Data.Length - _Offset) >= MinSize) { fixed (byte* DataPtr = this.Data) { var Hash = GetOffsetHash(_Offset); if (Waypoints.ContainsKey(Hash)) { //var Node = Waypoints[Hash].Last; foreach (var CompareOffset in Waypoints[Hash]) { int LocalMaxSize = Math.Min((Data.Length - _Offset), MaxSize); //if (!AllowOverlapping && (CompareOffset + LocalMaxSize > _Offset)) continue; int MatchedLength = PointerUtils.FindLargestMatch( &DataPtr[CompareOffset], &DataPtr[_Offset], LocalMaxSize ); /* var Hash1 = PointerUtils.FastHash(&DataPtr[CompareOffset], MinSize); var Hash2 = PointerUtils.FastHash(&DataPtr[_Offset], MinSize); for (int n = 0; n < MinSize; n++) { Console.WriteLine("{0:X2}, {1:X2}", DataPtr[CompareOffset + n], DataPtr[_Offset + n]); } Console.WriteLine(); Console.WriteLine("{0}, {1}, {2}, {3}: {4:X8}, {5:X8}, {6:X8}", MatchedLength, MinSize, MaxSize, LocalMaxSize, Hash, Hash1, Hash2); */ //Console.WriteLine("{0}, {1}, {2}", CompareOffset - _Offset, MatchedLength, CompareOffset - _Offset + MatchedLength); if (!AllowOverlapping && (CompareOffset - _Offset + MatchedLength) > 0) { MatchedLength = _Offset - CompareOffset; //continue; } if (MatchedLength >= MinSize) { if (FindSequenceResult.Size < MatchedLength) { FindSequenceResult.Size = MatchedLength; FindSequenceResult.Offset = CompareOffset; } if (MatchedLength == MaxSize) break; } } } } } return FindSequenceResult; }