sin365
9 months ago
4 changed files with 342 additions and 0 deletions
@ -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 |
@ -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; |
||||
} |
||||
} |
||||
} |
@ -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 |
||||
} |
||||
} |
Loading…
Reference in new issue