From 3b4f934a446329ca9b515861fa75efffbda390b7 Mon Sep 17 00:00:00 2001 From: sin365 <353374337@qq.com> Date: Wed, 16 Aug 2023 12:57:36 +0800 Subject: [PATCH] =?UTF-8?q?=E5=BD=92=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MHQuestHelperLib.sln | 13 ++ MHQuestHelperLib/HexHelper.cs | 232 +++++++++++++++++++++++ MHQuestHelperLib/MH2Tools.cs | 88 +++++++++ MHQuestHelperLib/MHQuestHelperLib.csproj | 9 + 4 files changed, 342 insertions(+) create mode 100644 MHQuestHelperLib.sln create mode 100644 MHQuestHelperLib/HexHelper.cs create mode 100644 MHQuestHelperLib/MH2Tools.cs create mode 100644 MHQuestHelperLib/MHQuestHelperLib.csproj diff --git a/MHQuestHelperLib.sln b/MHQuestHelperLib.sln new file mode 100644 index 0000000..6f2b83d --- /dev/null +++ b/MHQuestHelperLib.sln @@ -0,0 +1,13 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.4.33403.182 +MinimumVisualStudioVersion = 10.0.40219.1 +Global + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {47F1902A-A0BD-41C7-A5CB-82671CC3E518} + EndGlobalSection +EndGlobal diff --git a/MHQuestHelperLib/HexHelper.cs b/MHQuestHelperLib/HexHelper.cs new file mode 100644 index 0000000..23f9b94 --- /dev/null +++ b/MHQuestHelperLib/HexHelper.cs @@ -0,0 +1,232 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using System.Net.Http.Headers; +using System.Text; +using System.Threading.Tasks; + +namespace MHQuestHelperLib +{ + public class HexHelper + { + + public static byte[] CopyByteArr(byte[] src) + { + byte[] target = new byte[src.Length]; + //加载数据 + target = new byte[src.Length]; + for (int i = 0; i < src.Length; i++) + target[i] = src[i]; + return target; + } + + /// + /// 读取byte[]数据 + /// + /// + /// + /// + /// + public static byte[] ReadBytes(byte[] src, int lenght, int offset = 0) + { + byte[] data = new byte[lenght]; + for (int i = 0; i < lenght; i++) + { + data[i] = src[offset + i]; + } + return data; + } + + /** + * byte[]转换int byte高位在前 + */ + public static int bytesToInt(byte[] src,int lenght, int offset = 0) + { + if (lenght == 1) + return src[offset + 0]; + + byte[] data = new byte[lenght]; + for (int i = 0; i < lenght; i++) + { + data[i] = src[offset + i]; + } + + if(lenght == 2) + return BitConverter.ToInt16(data, 0); + else //if (lenght == 4) + return BitConverter.ToInt32(data, 0); + } + + /** + * byte[]转换int byte高位在前 + */ + public static uint bytesToUInt(byte[] src, int lenght, int offset = 0) + { + if (lenght == 1) + return src[offset + 0]; + + byte[] data = new byte[lenght]; + for (int i = 0; i < lenght; i++) + { + data[i] = src[offset + i]; + } + + if (lenght == 2) + return BitConverter.ToUInt16(data, 0); + else //if (lenght == 4) + return BitConverter.ToUInt32(data, 0); + } + + /** + * int 转 byte[] byte高位在前 + */ + public static byte[] intToBytes(int value) + { + return BitConverter.GetBytes(value); + } + + /** + * 从字节读取字符串 + */ + public static string ReadBytesToString(byte[] src, int Start, Encoding encoding = null) + { + List bytes = new List(); + + int index = 0; + while (true) + { + bytes.Add(src[Start + index]); + + if (src[Start + index + 1] == 0x00) + break; + + index++; + } + if (encoding == null) + encoding = Encoding.GetEncoding("Shift-JIS"); + string str = encoding.GetString(bytes.ToArray()); + return str; + } + + + /** + * 从字节读取字符串 + */ + public static string ReadBytesToString(byte[] src, Encoding encoding = null) + { + if (encoding == null) + encoding = Encoding.GetEncoding("Shift-JIS"); + string str = encoding.GetString(src.ToArray()); + return str; + } + + + /** + * 写入int到byte[] byte高位在前 + */ + public static void ModifyIntHexToBytes(byte[] srcdata, int targetvalue,int startoffset, int srclenght) + { + byte[] targetVal = intToBytes(targetvalue); + + //抹去数据 + for (int i = 0; i < srclenght; i++) + srcdata[startoffset + i] = 0x00; + + for (int i = 0; i < targetVal.Length && i < srclenght; i++) + srcdata[startoffset + i] = targetVal[i]; + } + + + /** + * 写入byte[]到byte[] byte高位在前 + */ + public static void ModifyDataToBytes(byte[] srcdata, byte[] targetVal, int startoffset) + { + //抹去数据 + for (int i = 0; i < targetVal.Length; i++) + srcdata[startoffset + i] = 0x00; + + for (int i = 0; i < targetVal.Length && i < targetVal.Length; i++) + srcdata[startoffset + i] = targetVal[i]; + } + + + + /** + * 对比数据 + */ + public static bool CheckDataEquals(byte[] srcdata, byte[] targetVal, int startoffset) + { + byte[] temp = new byte[targetVal.Length]; + for (int i = 0; i < targetVal.Length && i < targetVal.Length; i++) + temp[i] = srcdata[startoffset + i]; + + return Array.Equals(targetVal, temp); + } + + /// + /// 另一种16进制转10进制的处理方式,Multiplier参与*16的循环很巧妙,对Multiplier的处理很推荐,逻辑统一 + /// + /// + /// + public static int HexaToDecimal(string HexaDecimalString) + { + int Decimal = 0; + int Multiplier = 1; + + for (int i = HexaDecimalString.Length - 1; i >= 0; i--) + { + Decimal += HexaToDecimal(HexaDecimalString[i]) * Multiplier; + Multiplier *= 16; + } + return Decimal; + } + + static int HexaToDecimal(char c) + { + switch (c) + { + case '0': + return 0; + case '1': + return 1; + case '2': + return 2; + case '3': + return 3; + case '4': + return 4; + case '5': + return 5; + case '6': + return 6; + case '7': + return 7; + case '8': + return 8; + case '9': + return 9; + case 'A': + case 'a': + return 10; + case 'B': + case 'b': + return 11; + case 'C': + case 'c': + return 12; + case 'D': + case 'd': + return 13; + case 'E': + case 'e': + return 14; + case 'F': + case 'f': + return 15; + } + return -1; + } + } +} diff --git a/MHQuestHelperLib/MH2Tools.cs b/MHQuestHelperLib/MH2Tools.cs new file mode 100644 index 0000000..fdae1e6 --- /dev/null +++ b/MHQuestHelperLib/MH2Tools.cs @@ -0,0 +1,88 @@ +namespace MHQuestHelperLib +{ + public class MH2Tools + { + #region 公开属性 + public int QuestInfoPtr => GetQuestInfoPtr(); + public int CharactorScenePtr => GetCharactorScenePtr(); + public int BOSSInFoPtr => GetBOSSInFoPtr(); + public int QuestRewardPtr => GetQuestRewardPtr(); + public int SuppliesItemPtr => GetSuppliesItemPtr(); + public int ItemPointPtr => GetItemPointPtr(); + public int FishGroupPtr => GetFishGroupPtr(); + #endregion + + byte[] target; + public MH2Tools(byte[] src) + { + target = HexHelper.CopyByteArr(src);//加载数据 + } + #region 指针查询类 + /// + /// 任务信息指针 + /// + /// + int GetQuestInfoPtr() + { + //从前4字节取出指针 定位任务信息位置 + return HexHelper.bytesToInt(target, 4, 0x00); + } + /// + /// 任务信息指针 + /// + /// + int GetCharactorScenePtr() + { + return HexHelper.bytesToInt(target, 4, 0x04); + } + /// + /// BOSS(头部信息,指针 + /// + /// + int GetBOSSInFoPtr() + { + return HexHelper.bytesToInt(target, 4, 0x18); + } + /// + /// 取报酬组头部信息 + /// + /// + int GetQuestRewardPtr() + { + return HexHelper.bytesToInt(target, 4, 0x0C); + } + /// + /// 支援道具指针 + /// + /// + int GetSuppliesItemPtr() + { + return HexHelper.bytesToInt(target, 4, 0x08); + } + /// + /// 采集点指针 + /// + /// + int GetItemPointPtr() + { + return HexHelper.bytesToInt(target, 4, 0x38); + } + /// + /// 鱼群指针 + /// + /// + int GetFishGroupPtr() + { + return HexHelper.bytesToInt(target, 4, 0x40); + } + #endregion + + #region 读取类 + + #endregion + + #region 操作类 + + #endregion + } +} \ No newline at end of file diff --git a/MHQuestHelperLib/MHQuestHelperLib.csproj b/MHQuestHelperLib/MHQuestHelperLib.csproj new file mode 100644 index 0000000..cfadb03 --- /dev/null +++ b/MHQuestHelperLib/MHQuestHelperLib.csproj @@ -0,0 +1,9 @@ + + + + net7.0 + enable + enable + + +