解决idata.dat解包的问题,自动化auto参数mode
This commit is contained in:
parent
127e24f642
commit
85e1b18652
174
Program.cs
174
Program.cs
@ -1,8 +1,4 @@
|
|||||||
using System;
|
using System.Text;
|
||||||
using System.Drawing;
|
|
||||||
using System.Reflection;
|
|
||||||
using System.Text;
|
|
||||||
using static System.Runtime.InteropServices.JavaScript.JSType;
|
|
||||||
|
|
||||||
namespace MHiRepacker
|
namespace MHiRepacker
|
||||||
{
|
{
|
||||||
@ -17,23 +13,18 @@ namespace MHiRepacker
|
|||||||
static string helperStr = @"
|
static string helperStr = @"
|
||||||
————————————————————————
|
————————————————————————
|
||||||
params:
|
params:
|
||||||
[func] [inputpath] [outputpath] <mode>
|
[func] [inputpath] [outputpath]
|
||||||
func: unpack/repack
|
func: unpack/repack
|
||||||
unpack: [inputpath] is input File path ,[outputpath] is output Directory path
|
unpack: [inputpath] is input File path ,[outputpath] is output Directory path
|
||||||
repack: [inputpath] is input Directory path ,[outputpath] is output File path
|
repack: [inputpath] is input Directory path ,[outputpath] is output File path
|
||||||
mode: mode0/mode1
|
|
||||||
mode0(default): Universal structure (look like exceldata.dat)
|
|
||||||
mode1: Universal structure (look like syokibugu)
|
|
||||||
|
|
||||||
|
|
||||||
eg.
|
eg.
|
||||||
|
|
||||||
unpack G:\exceldata.dat G:\exceldata_unpacked
|
unpack G:\exceldata.dat G:\exceldata_unpacked
|
||||||
repack G:\exceldata_unpacked G:\exceldata.dat
|
repack G:\exceldata_unpacked G:\exceldata.dat
|
||||||
|
|
||||||
unpack G:\syokibugu.dat G:\syokibugu_unpacked mode1
|
unpack G:\syokibugu.dat G:\syokibugu_unpacked
|
||||||
repack G:\syokibugu_unpacked G:\syokibugu mode1
|
repack G:\syokibugu_unpacked G:\syokibugu
|
||||||
|
|
||||||
————————————————————————
|
————————————————————————
|
||||||
";
|
";
|
||||||
|
|
||||||
@ -46,7 +37,7 @@ repack G:\syokibugu_unpacked G:\syokibugu mode1
|
|||||||
static void Main(string[] args)
|
static void Main(string[] args)
|
||||||
{
|
{
|
||||||
|
|
||||||
string title = $"MHiRepacker Ver.1.3 By 皓月云 axibug.com";
|
string title = $"MHiRepacker Ver.1.4 By 皓月云 axibug.com";
|
||||||
Console.Title = title;
|
Console.Title = title;
|
||||||
Console.WriteLine(title);
|
Console.WriteLine(title);
|
||||||
|
|
||||||
@ -60,23 +51,14 @@ repack G:\syokibugu_unpacked G:\syokibugu mode1
|
|||||||
|
|
||||||
string modecmd = args[0];
|
string modecmd = args[0];
|
||||||
|
|
||||||
if (modecmd.ToLower() == "unpack")
|
|
||||||
bUnpack = true;
|
|
||||||
else if (modecmd.ToLower() == "repack")
|
|
||||||
bUnpack = false;
|
|
||||||
else
|
|
||||||
{
|
|
||||||
PrintHelperStr();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
Console.WriteLine($"func=>{args[0].ToLower()}");
|
Console.WriteLine($"func=>{args[0].ToLower()}");
|
||||||
|
|
||||||
string inputpath;
|
string inputpath;
|
||||||
string outputpath;
|
string outputpath;
|
||||||
inputpath = args[1];
|
inputpath = args[1];
|
||||||
outputpath = args[2];
|
outputpath = args[2];
|
||||||
|
Console.WriteLine($"inputpath=>{inputpath}");
|
||||||
|
Console.WriteLine($"outputpath=>{outputpath}");
|
||||||
|
|
||||||
if (bUnpack)
|
if (bUnpack)
|
||||||
{
|
{
|
||||||
@ -97,15 +79,53 @@ repack G:\syokibugu_unpacked G:\syokibugu mode1
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Console.WriteLine($"inputpath=>{inputpath}");
|
if (modecmd.ToLower() == "unpack")
|
||||||
Console.WriteLine($"outputpath=>{outputpath}");
|
{
|
||||||
|
bUnpack = true;
|
||||||
if (args.Length >= 4 && args[3].ToLower() == "mode1")
|
if (!FileHelper.LoadFile(inputpath, out byte[] inputbytes))
|
||||||
mode = 1;
|
{
|
||||||
|
Console.WriteLine($"读取失败:{inputpath}");
|
||||||
|
PrintHelperStr();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
List<uint> SizeList = new List<uint>();
|
||||||
|
List<string> tempLog = new List<string>();
|
||||||
|
uint WorkedDataLenght = 0;
|
||||||
|
if (!TryGetheadWithCheck(inputbytes, 0, false, ref SizeList, ref tempLog, out int checkmode, ref WorkedDataLenght))
|
||||||
|
{
|
||||||
|
Console.WriteLine($"读取失败,文件以0x00起始,:{inputpath}");
|
||||||
|
PrintHelperStr();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
mode = checkmode;
|
||||||
|
}
|
||||||
|
else if (modecmd.ToLower() == "repack")
|
||||||
|
{
|
||||||
|
bUnpack = false;
|
||||||
|
string[] dirs = Directory.GetDirectories(inputpath).Select(w => new DirectoryInfo(w).Name).ToArray();
|
||||||
|
if (dirs.Length == 4 &&
|
||||||
|
dirs.Contains("0000") &&
|
||||||
|
dirs.Contains("0001") &&
|
||||||
|
dirs.Contains("0002") &&
|
||||||
|
dirs.Contains("0003")
|
||||||
|
)
|
||||||
|
mode = 1;
|
||||||
|
else
|
||||||
|
mode = 0;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
mode = 0;
|
{
|
||||||
|
PrintHelperStr();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
Console.WriteLine($"mode=>mode{mode}");
|
|
||||||
|
//if (args.Length >= 4 && args[3].ToLower() == "mode1")
|
||||||
|
// mode = 1;
|
||||||
|
//else
|
||||||
|
// mode = 0;
|
||||||
|
|
||||||
|
Console.WriteLine($"audo mode=>mode{mode}");
|
||||||
|
|
||||||
bool bResult = false;
|
bool bResult = false;
|
||||||
#if !DEBUG
|
#if !DEBUG
|
||||||
@ -150,37 +170,85 @@ repack G:\syokibugu_unpacked G:\syokibugu mode1
|
|||||||
return Unpack_Mode0_logic(inputbytes, 0, Unpack_Output, out uint WorkedDataLenght);
|
return Unpack_Mode0_logic(inputbytes, 0, Unpack_Output, out uint WorkedDataLenght);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
readonly static uint StartHead = 0x01;
|
||||||
|
readonly static byte[] StartPKHead = { 0x50, 0x4B, 0x03, 0x04, 0x14 };//PK
|
||||||
|
static bool CheckPKHead(byte[] temp, int startIdx)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < StartPKHead.Length; i++)
|
||||||
|
{
|
||||||
|
startIdx++;
|
||||||
|
if (startIdx < temp.Length && StartPKHead[i] != temp[startIdx])
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
static bool TryGetheadWithCheck(byte[] inputbytes, uint startPos, bool skipConsoleLog, ref List<uint> SizeList, ref List<string> tempLog, out int checkmode, ref uint WorkedDataLenght)
|
||||||
|
{
|
||||||
|
if (inputbytes[0] == 0x00)
|
||||||
|
{
|
||||||
|
checkmode = default;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
WorkedDataLenght += StartHead;
|
||||||
|
uint pos = startPos + StartHead;
|
||||||
|
//bool CheckStartEnd(byte[] temp, int startIdx)
|
||||||
|
//{
|
||||||
|
// for (int i = 0; i < StartHeadEndArr.Length; i++)
|
||||||
|
// {
|
||||||
|
// if (StartHeadEndArr[i] != temp[startIdx++])
|
||||||
|
// return true;
|
||||||
|
// }
|
||||||
|
// return false;
|
||||||
|
//}
|
||||||
|
|
||||||
|
//int idx = 0;
|
||||||
|
uint StartContentPtr = 0;
|
||||||
|
string log;
|
||||||
|
|
||||||
|
log = $"文件头读取:";
|
||||||
|
if (!skipConsoleLog) Console.WriteLine(log);
|
||||||
|
tempLog.Add(log);
|
||||||
|
|
||||||
|
//while (CheckStartEnd(inputbytes, (int)pos) && CheckStartEnd(inputbytes, (int)pos + 1))
|
||||||
|
for (int idx = 0; idx < inputbytes[0]; idx++)
|
||||||
|
{
|
||||||
|
uint size = HexHelper.bytesToUInt(inputbytes, 2, (int)pos);
|
||||||
|
SizeList.Add(size);
|
||||||
|
log = $"lenght:[{idx}]=>{size}({size.ToString("X")})| byte src: 0x{inputbytes[pos].ToString("X")} 0x{inputbytes[pos + 1].ToString("X")}";
|
||||||
|
if (!skipConsoleLog) Console.WriteLine(log);
|
||||||
|
tempLog.Add(log);
|
||||||
|
pos += 2;
|
||||||
|
WorkedDataLenght += 2;
|
||||||
|
}
|
||||||
|
log = $"读取完毕共{SizeList.Count}个";
|
||||||
|
if (!skipConsoleLog) Console.WriteLine(log);
|
||||||
|
tempLog.Add(log);
|
||||||
|
|
||||||
|
long packagelenght = WorkedDataLenght + SizeList.Sum(w => w);
|
||||||
|
checkmode = inputbytes.Length == packagelenght ? 0 : 1;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
static bool Unpack_Mode0_logic(byte[] inputbytes, uint startPos, string Unpack_Output, out uint WorkedDataLenght)
|
static bool Unpack_Mode0_logic(byte[] inputbytes, uint startPos, string Unpack_Output, out uint WorkedDataLenght)
|
||||||
{
|
{
|
||||||
WorkedDataLenght = 0;
|
WorkedDataLenght = 0;
|
||||||
uint StartHead = 0x01;
|
uint StartHead = 0x01;
|
||||||
WorkedDataLenght += StartHead;
|
WorkedDataLenght += StartHead;
|
||||||
byte[] StartHeadEndArr = { 0x50, 0x4B, 0x03, 0x04, 0x14 };//PK
|
//byte[] StartHeadEndArr = { 0x50, 0x4B, 0x03, 0x04, 0x14 };//PK
|
||||||
|
|
||||||
List<string> tempLog = new List<string>();
|
List<string> tempLog = new List<string>();
|
||||||
uint pos = startPos + StartHead;
|
uint pos = startPos + StartHead;
|
||||||
bool CheckStartEnd(byte[] temp, int startIdx)
|
|
||||||
{
|
|
||||||
for (int i = 0; i < StartHeadEndArr.Length; i++)
|
|
||||||
{
|
|
||||||
if (StartHeadEndArr[i] != temp[startIdx++])
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
List<uint> SizeList = new List<uint>();
|
List<uint> SizeList = new List<uint>();
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
int idx = 0;
|
|
||||||
uint StartContentPtr = 0;
|
uint StartContentPtr = 0;
|
||||||
string log;
|
string log;
|
||||||
tempLog.Add("文件头读取:");
|
tempLog.Add("文件头读取:");
|
||||||
while (CheckStartEnd(inputbytes, (int)pos) && CheckStartEnd(inputbytes, (int)pos + 1))
|
//while (CheckStartEnd(inputbytes, (int)pos) && CheckStartEnd(inputbytes, (int)pos + 1))
|
||||||
|
for (int idx = 0; idx < inputbytes[0]; idx++)
|
||||||
{
|
{
|
||||||
uint size = HexHelper.bytesToUInt(inputbytes, 2, (int)pos);
|
uint size = HexHelper.bytesToUInt(inputbytes, 2, (int)pos);
|
||||||
SizeList.Add(size);
|
SizeList.Add(size);
|
||||||
log = $"lenght:[{idx++}]=>{size}({size.ToString("X")})| byte src: 0x{inputbytes[pos].ToString("X")} 0x{inputbytes[pos + 1].ToString("X")}";
|
log = $"lenght:[{idx}]=>{size}({size.ToString("X")})| byte src: 0x{inputbytes[pos].ToString("X")} 0x{inputbytes[pos + 1].ToString("X")}";
|
||||||
Console.WriteLine(log);
|
Console.WriteLine(log);
|
||||||
tempLog.Add(log);
|
tempLog.Add(log);
|
||||||
pos += 2;
|
pos += 2;
|
||||||
@ -207,7 +275,7 @@ repack G:\syokibugu_unpacked G:\syokibugu mode1
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
log = $"Unpack完毕,共{SizeList.Count}个.zip";
|
log = $"Unpack完毕,共{SizeList.Count}个文件";
|
||||||
Console.WriteLine(log);
|
Console.WriteLine(log);
|
||||||
tempLog.Add(log);
|
tempLog.Add(log);
|
||||||
if (File.Exists(Unpack_Output + $"//filelist.txt"))
|
if (File.Exists(Unpack_Output + $"//filelist.txt"))
|
||||||
@ -237,14 +305,14 @@ repack G:\syokibugu_unpacked G:\syokibugu mode1
|
|||||||
List<string> tempLog = new List<string>();
|
List<string> tempLog = new List<string>();
|
||||||
using (FileStream fs = new FileStream(Unpack_Output, FileMode.Create))
|
using (FileStream fs = new FileStream(Unpack_Output, FileMode.Create))
|
||||||
{
|
{
|
||||||
Repack_Mode0_logic(Repack_Input,fs, Unpack_Output,ref tempLog);
|
Repack_Mode0_logic(Repack_Input, fs, Unpack_Output, ref tempLog);
|
||||||
}
|
}
|
||||||
|
|
||||||
File.WriteAllLines(Unpack_Output + $".txt", tempLog);
|
File.WriteAllLines(Unpack_Output + $".txt", tempLog);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool Repack_Mode0_logic(string Repack_Input,FileStream fs, string Unpack_Output,ref List<string> tempLog,bool skip_y = false)
|
static bool Repack_Mode0_logic(string Repack_Input, FileStream fs, string Unpack_Output, ref List<string> tempLog, bool skip_y = false)
|
||||||
{
|
{
|
||||||
string[] zipfiles = FileHelper.GetDirFile(Repack_Input).Where(w => w.ToLower().EndsWith(".zip")).ToArray();
|
string[] zipfiles = FileHelper.GetDirFile(Repack_Input).Where(w => w.ToLower().EndsWith(".zip")).ToArray();
|
||||||
List<byte[]> files = new List<byte[]>();
|
List<byte[]> files = new List<byte[]>();
|
||||||
@ -379,7 +447,7 @@ repack G:\syokibugu_unpacked G:\syokibugu mode1
|
|||||||
List<byte> temp_0 = new List<byte>();
|
List<byte> temp_0 = new List<byte>();
|
||||||
while (true)
|
while (true)
|
||||||
{
|
{
|
||||||
if (Pos +1 < fulldata.Length && fulldata[Pos + 1] == 0x00)
|
if (Pos + 1 < fulldata.Length && fulldata[Pos + 1] == 0x00)
|
||||||
{
|
{
|
||||||
Pos += 1;
|
Pos += 1;
|
||||||
temp_0.Add(fulldata[Pos]);
|
temp_0.Add(fulldata[Pos]);
|
||||||
@ -437,12 +505,12 @@ repack G:\syokibugu_unpacked G:\syokibugu mode1
|
|||||||
{
|
{
|
||||||
for (int subpack_idx = 0; subpack_idx < dirs.Length; subpack_idx++)
|
for (int subpack_idx = 0; subpack_idx < dirs.Length; subpack_idx++)
|
||||||
{
|
{
|
||||||
string subdir = dirs[subpack_idx];
|
string subdir = dirs[subpack_idx];
|
||||||
|
|
||||||
log = $"-- 开始写入Subpack[{subpack_idx}]:下的zip包";
|
log = $"-- 开始写入Subpack[{subpack_idx}]:下的zip包";
|
||||||
Console.WriteLine(log);
|
Console.WriteLine(log);
|
||||||
tempLog.Add(log);
|
tempLog.Add(log);
|
||||||
Repack_Mode0_logic(subdir, fs, Repack_Output,ref tempLog,true);
|
Repack_Mode0_logic(subdir, fs, Repack_Output, ref tempLog, true);
|
||||||
log = $"-- 完成写入Subpack[{subpack_idx}]:下的zip包";
|
log = $"-- 完成写入Subpack[{subpack_idx}]:下的zip包";
|
||||||
Console.WriteLine(log);
|
Console.WriteLine(log);
|
||||||
tempLog.Add(log);
|
tempLog.Add(log);
|
||||||
@ -474,7 +542,7 @@ repack G:\syokibugu_unpacked G:\syokibugu mode1
|
|||||||
|
|
||||||
if (needAdd < 0)
|
if (needAdd < 0)
|
||||||
{
|
{
|
||||||
Console.WriteLine($"--Subpack[{ subpack_idx}],超出MHi预设区间大小");
|
Console.WriteLine($"--Subpack[{subpack_idx}],超出MHi预设区间大小");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
40
README.md
40
README.md
@ -1,27 +1,45 @@
|
|||||||
# MHiRepacker
|
# MHiRepacker
|
||||||
|
|
||||||
Monster Hunter i for SH Unpack/Repacker Tools
|
## Monster Hunter i for SH Unpack/Repacker Tools ("怪物猎人i for 夏普"解包打包工具)
|
||||||
"怪物猎人i for 夏普"解包打包工具
|
|
||||||
|
|
||||||
|
|
||||||
感谢"猪突猛进锅"分析文件
|
感谢"猪突猛进锅"分析文件
|
||||||
|
|
||||||
## params:
|
## params:
|
||||||
```
|
```
|
||||||
[func] [inputpath] [outputpath] <mode>
|
[func] [inputpath] [outputpath]
|
||||||
func: unpack/repack
|
func: unpack/repack
|
||||||
unpack: [inputpath] is input File path ,[outputpath] is output Directory path
|
unpack: [inputpath] is input File path ,[outputpath] is output Directory path
|
||||||
repack: [inputpath] is input Directory path ,[outputpath] is output File path
|
repack: [inputpath] is input Directory path ,[outputpath] is output File path
|
||||||
mode: mode0/mode1
|
|
||||||
mode0(default): Universal structure (look like exceldata.dat)
|
|
||||||
mode1: Universal structure (look like syokibugu)
|
|
||||||
|
|
||||||
|
|
||||||
eg.
|
eg.
|
||||||
|
|
||||||
unpack G:\exceldata.dat G:\exceldata_unpacked
|
unpack G:\exceldata.dat G:\exceldata_unpacked
|
||||||
repack G:\exceldata_unpacked G:\exceldata.dat
|
repack G:\exceldata_unpacked G:\exceldata.dat
|
||||||
|
|
||||||
unpack G:\syokibugu.dat G:\syokibugu_unpacked mode1
|
unpack G:\syokibugu.dat G:\syokibugu_unpacked
|
||||||
repack G:\syokibugu_unpacked G:\syokibugu mode1
|
repack G:\syokibugu_unpacked G:\syokibugu
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
# update:
|
||||||
|
|
||||||
|
### 1.4
|
||||||
|
|
||||||
|
抛弃mode参数,现在由程序自动选择mode1或者mode2,用户不用关心
|
||||||
|
|
||||||
|
There is no need for param:'mode' now; Automatically determine mode 1 or mode 2;
|
||||||
|
|
||||||
|
auto mode:
|
||||||
|
|
||||||
|
mode0(default): Universal structure (look like exceldata.dat)
|
||||||
|
mode1: Universal structure (look like syokibugu)
|
||||||
|
|
||||||
|
解决 idata.dat 不能解包的问题
|
||||||
|
|
||||||
|
Resolve the issue of idata.dat not being able to unpack
|
||||||
|
|
||||||
|
### 1.3
|
||||||
|
|
||||||
|
解决 exceldata.dat 不能解包的问题
|
||||||
|
|
||||||
|
Resolve the issue of exceldata.dat not being able to unpack
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user