diff --git a/RevokeMsgPatcher.Assistant/Matcher/FuzzyMatcher.cs b/RevokeMsgPatcher.Assistant/Matcher/FuzzyMatcher.cs new file mode 100644 index 0000000..3ecf417 --- /dev/null +++ b/RevokeMsgPatcher.Assistant/Matcher/FuzzyMatcher.cs @@ -0,0 +1,105 @@ +using System; +using System.Collections.Generic; +using System.Linq; + +namespace RevokeMsgPatcher.Assistant.Matcher +{ + /// + /// 对16进制数据进行模糊查找 + /// 通配符的方式 + /// + public class FuzzyMatcher + { + public const byte wildcard = 0x3F; // 通配符 + + /// + /// 模糊匹配所有 + /// + /// 被查找对象 + /// 查找串 + /// + public static int[] MatchAll(byte[] content, byte[] pattern) + { + byte[] head = GetHead(pattern); + int[] indexs = BoyerMooreMatcher.MatchAll(content, head); + // 头串和查找串相同则直接返回,不同则继续判断是否符合查询串 + if (head.Length == pattern.Length) + { + return indexs; + } + else + { + List res = new List(); + foreach (int index in indexs) + { + if (IsEqual(content, index, pattern)) + { + res.Add(index); + } + } + if (res.Count > 0) + { + return res.ToArray(); + } + else + { + return null; + } + } + } + + /// + /// 获取头串 + /// + /// 完整查找串 + /// + private static byte[] GetHead(byte[] whole) + { + int len = whole.Length; + for (int i = 0; i < whole.Length; i++) + { + if (whole[i] == wildcard) + { + len = i; + break; + } + } + if (len == 0) + { + throw new Exception("不正确的通配符位置!"); + } + return whole.Take(len).ToArray(); + } + + /// + /// 确认整个查找串是否匹配 + /// + /// 被查找对象 + /// 头串匹配位置 + /// 完整查找串 + /// + private static bool IsEqual(byte[] content, int start, byte[] whole) + { + int i = 0; + for (i = 0; i < whole.Length; i++) + { + if (whole[i] == wildcard) + { + continue; + } + if (content[start + i] != whole[i]) + { + break; + } + } + if (i == whole.Length) + { + return true; + } + else + { + return false; + } + } + } +} diff --git a/RevokeMsgPatcher.Assistant/RevokeMsgPatcher.Assistant.csproj b/RevokeMsgPatcher.Assistant/RevokeMsgPatcher.Assistant.csproj index 00c5ac4..a61f64c 100644 --- a/RevokeMsgPatcher.Assistant/RevokeMsgPatcher.Assistant.csproj +++ b/RevokeMsgPatcher.Assistant/RevokeMsgPatcher.Assistant.csproj @@ -69,6 +69,7 @@ + @@ -97,12 +98,6 @@ - - - {977bf781-ced8-4389-9404-0fa08fdf21df} - RevokeMsgPatcher - - False @@ -110,5 +105,11 @@ false + + + {977bf781-ced8-4389-9404-0fa08fdf21df} + RevokeMsgPatcher + + \ No newline at end of file