예제 #1
0
        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);
        }
예제 #2
0
        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);
        }
예제 #3
0
파일: LzBuffer.cs 프로젝트: e-COS/cspspemu
        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;
        }
예제 #4
0
		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;
		}