- [Core] fix but with wrongly identified sigantures [GI]
This commit is contained in:
@@ -159,7 +159,7 @@ namespace AssetStudio.CLI
|
|||||||
Logger.Info($"Decompressing {reader.FileName} ...");
|
Logger.Info($"Decompressing {reader.FileName} ...");
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var mhy0File = new MhyFile(reader, reader.FullPath, (Mhy)Game);
|
var mhy0File = new MhyFile(reader, (Mhy)Game);
|
||||||
reader.Dispose();
|
reader.Dispose();
|
||||||
if (mhy0File.fileList.Count > 0)
|
if (mhy0File.fileList.Count > 0)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -160,7 +160,7 @@ namespace AssetStudio.GUI
|
|||||||
StatusStripUpdate($"Decompressing {reader.FileName} ...");
|
StatusStripUpdate($"Decompressing {reader.FileName} ...");
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var mhy0File = new MhyFile(reader, reader.FullPath, (Mhy)Game);
|
var mhy0File = new MhyFile(reader, (Mhy)Game);
|
||||||
reader.Dispose();
|
reader.Dispose();
|
||||||
if (mhy0File.fileList.Count > 0)
|
if (mhy0File.fileList.Count > 0)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -512,8 +512,8 @@ namespace AssetStudio
|
|||||||
}
|
}
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var mhyFile = new MhyFile(reader, reader.FullPath, (Mhy)Game);
|
var mhyFile = new MhyFile(reader, (Mhy)Game);
|
||||||
Logger.Verbose($"mhy total size: {mhyFile.TotalSize:X8}");
|
Logger.Verbose($"mhy total size: {mhyFile.m_Header.size:X8}");
|
||||||
foreach (var file in mhyFile.fileList)
|
foreach (var file in mhyFile.fileList)
|
||||||
{
|
{
|
||||||
var dummyPath = Path.Combine(Path.GetDirectoryName(reader.FullPath), file.fileName);
|
var dummyPath = Path.Combine(Path.GetDirectoryName(reader.FullPath), file.fileName);
|
||||||
|
|||||||
@@ -14,15 +14,11 @@ namespace AssetStudio
|
|||||||
|
|
||||||
public BundleFile.Header m_Header;
|
public BundleFile.Header m_Header;
|
||||||
public List<StreamFile> fileList;
|
public List<StreamFile> fileList;
|
||||||
public long Offset;
|
|
||||||
public Mhy mhy;
|
public Mhy mhy;
|
||||||
|
|
||||||
public long TotalSize => 8 + m_Header.compressedBlocksInfoSize + m_BlocksInfo.Sum(x => x.compressedSize);
|
public MhyFile(FileReader reader, Mhy mhy)
|
||||||
|
|
||||||
public MhyFile(FileReader reader, string path, Mhy mhy)
|
|
||||||
{
|
{
|
||||||
this.mhy = mhy;
|
this.mhy = mhy;
|
||||||
Offset = reader.Position;
|
|
||||||
reader.Endian = EndianType.LittleEndian;
|
reader.Endian = EndianType.LittleEndian;
|
||||||
|
|
||||||
signature = reader.ReadStringToNull(4);
|
signature = reader.ReadStringToNull(4);
|
||||||
@@ -40,9 +36,14 @@ namespace AssetStudio
|
|||||||
};
|
};
|
||||||
Logger.Verbose($"Header: {m_Header}");
|
Logger.Verbose($"Header: {m_Header}");
|
||||||
ReadBlocksInfoAndDirectory(reader);
|
ReadBlocksInfoAndDirectory(reader);
|
||||||
using var blocksStream = CreateBlocksStream(path);
|
using var blocksStream = CreateBlocksStream(reader.FullPath);
|
||||||
ReadBlocks(reader, blocksStream);
|
ReadBlocks(reader, blocksStream);
|
||||||
ReadFiles(blocksStream, path);
|
ReadFiles(blocksStream, reader.FullPath);
|
||||||
|
m_Header.size = 8 + m_Header.compressedBlocksInfoSize + m_BlocksInfo.Sum(x => x.compressedSize);
|
||||||
|
while (reader.PeekChar() == '\0')
|
||||||
|
{
|
||||||
|
reader.Position++;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void ReadBlocksInfoAndDirectory(FileReader reader)
|
private void ReadBlocksInfoAndDirectory(FileReader reader)
|
||||||
|
|||||||
@@ -80,43 +80,11 @@ namespace AssetStudio
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
|
||||||
using var reader = new FileReader(path, this, true);
|
|
||||||
var signature = reader.FileType switch
|
|
||||||
{
|
|
||||||
FileType.BundleFile => "UnityFS\x00",
|
|
||||||
FileType.BlbFile => "Blb\x02",
|
|
||||||
FileType.MhyFile => Encoding.UTF8.GetString(reader.ReadBytes(4)),
|
|
||||||
FileType.ENCRFile => "ENCR\x00",
|
|
||||||
_ => throw new InvalidOperationException()
|
|
||||||
};
|
|
||||||
reader.Position = 0;
|
|
||||||
|
|
||||||
Logger.Verbose($"Prased signature: {signature}");
|
|
||||||
|
|
||||||
var signatureBytes = Encoding.UTF8.GetBytes(signature);
|
|
||||||
var buffer = ArrayPool<byte>.Shared.Rent(BufferSize);
|
|
||||||
try
|
|
||||||
{
|
{
|
||||||
while (Remaining > 0)
|
while (Remaining > 0)
|
||||||
{
|
{
|
||||||
var index = 0;
|
Offset = AbsolutePosition;
|
||||||
var absOffset = AbsolutePosition;
|
yield return AbsolutePosition;
|
||||||
var read = Read(buffer);
|
|
||||||
while (index < read)
|
|
||||||
{
|
|
||||||
index = buffer.AsSpan(0, read).Search(signatureBytes, index);
|
|
||||||
if (index == -1) break;
|
|
||||||
var offset = absOffset + index;
|
|
||||||
Offset = offset;
|
|
||||||
yield return offset;
|
|
||||||
index++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
finally
|
|
||||||
{
|
|
||||||
ArrayPool<byte>.Shared.Return(buffer, true);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user