This commit is contained in:
sin365 2023-08-16 12:57:36 +08:00
parent d5c58aa664
commit 3b4f934a44
4 changed files with 342 additions and 0 deletions

13
MHQuestHelperLib.sln Normal file
View File

@ -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

View File

@ -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;
}
/// <summary>
/// 读取byte[]数据
/// </summary>
/// <param name="src"></param>
/// <param name="lenght"></param>
/// <param name="offset"></param>
/// <returns></returns>
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<byte> bytes = new List<byte>();
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);
}
/// <summary>
/// 另一种16进制转10进制的处理方式Multiplier参与*16的循环很巧妙对Multiplier的处理很推荐逻辑统一
/// </summary>
/// <param name="HexaDecimalString"></param>
/// <returns></returns>
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;
}
}
}

View File

@ -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
/// <summary>
/// 任务信息指针
/// </summary>
/// <returns></returns>
int GetQuestInfoPtr()
{
//从前4字节取出指针 定位任务信息位置
return HexHelper.bytesToInt(target, 4, 0x00);
}
/// <summary>
/// 任务信息指针
/// </summary>
/// <returns></returns>
int GetCharactorScenePtr()
{
return HexHelper.bytesToInt(target, 4, 0x04);
}
/// <summary>
/// BOSS(头部信息,指针
/// </summary>
/// <returns></returns>
int GetBOSSInFoPtr()
{
return HexHelper.bytesToInt(target, 4, 0x18);
}
/// <summary>
/// 取报酬组头部信息
/// </summary>
/// <returns></returns>
int GetQuestRewardPtr()
{
return HexHelper.bytesToInt(target, 4, 0x0C);
}
/// <summary>
/// 支援道具指针
/// </summary>
/// <returns></returns>
int GetSuppliesItemPtr()
{
return HexHelper.bytesToInt(target, 4, 0x08);
}
/// <summary>
/// 采集点指针
/// </summary>
/// <returns></returns>
int GetItemPointPtr()
{
return HexHelper.bytesToInt(target, 4, 0x38);
}
/// <summary>
/// 鱼群指针
/// </summary>
/// <returns></returns>
int GetFishGroupPtr()
{
return HexHelper.bytesToInt(target, 4, 0x40);
}
#endregion
#region
#endregion
#region
#endregion
}
}

View File

@ -0,0 +1,9 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net7.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
</Project>