support the 'UnityFS' asset bundle type with LZMA compression (not tested)

This commit is contained in:
Perfare 2016-08-15 13:16:11 +08:00
parent ff144b41eb
commit 56825b5e48

View File

@ -123,18 +123,10 @@ namespace Unity_Studio
var bundleSize = b_Stream.ReadInt64(); var bundleSize = b_Stream.ReadInt64();
int compressedSize = b_Stream.ReadInt32(); int compressedSize = b_Stream.ReadInt32();
int uncompressedSize = b_Stream.ReadInt32(); int uncompressedSize = b_Stream.ReadInt32();
// (UnityFS) flags int flag = b_Stream.ReadInt32() & 0x3F;
// 0x100 = <unknown>
// 0x80 = data header at end of file
// 0x40 = entry info present
// 0x3f = low six bits are data header compression method
// 0 = none
// 1 = LZMA
// 3 = LZ4
int unknown = b_Stream.ReadInt32();
var entryinfoBytes = b_Stream.ReadBytes(compressedSize); var entryinfoBytes = b_Stream.ReadBytes(compressedSize);
EndianStream entryinfo; EndianStream entryinfo;
if (uncompressedSize > compressedSize) if (flag == 3)//LZ4
{ {
byte[] uncompressedBytes = new byte[uncompressedSize]; byte[] uncompressedBytes = new byte[uncompressedSize];
using (var mstream = new MemoryStream(entryinfoBytes)) using (var mstream = new MemoryStream(entryinfoBytes))
@ -145,6 +137,10 @@ namespace Unity_Studio
} }
entryinfo = new EndianStream(new MemoryStream(uncompressedBytes), EndianType.BigEndian); entryinfo = new EndianStream(new MemoryStream(uncompressedBytes), EndianType.BigEndian);
} }
else if(flag == 1)//LZMA
{
entryinfo = new EndianStream(SevenZip.Compression.LZMA.SevenZipHelper.StreamDecompress(new MemoryStream(entryinfoBytes)), EndianType.BigEndian);
}
else else
{ {
entryinfo = new EndianStream(new MemoryStream(entryinfoBytes), EndianType.BigEndian); entryinfo = new EndianStream(new MemoryStream(entryinfoBytes), EndianType.BigEndian);
@ -159,13 +155,9 @@ namespace Unity_Studio
{ {
uncompressedSize = entryinfo.ReadInt32(); uncompressedSize = entryinfo.ReadInt32();
compressedSize = entryinfo.ReadInt32(); compressedSize = entryinfo.ReadInt32();
//0 = none flag = entryinfo.ReadInt16() & 0x3F;
//1 = LZMA
//3 = LZ4
//0x40 = 0?
unknown = entryinfo.ReadInt16();
var compressedBytes = b_Stream.ReadBytes(compressedSize); var compressedBytes = b_Stream.ReadBytes(compressedSize);
if (uncompressedSize > compressedSize) if (flag == 3)//LZ4
{ {
var uncompressedBytes = new byte[uncompressedSize]; var uncompressedBytes = new byte[uncompressedSize];
using (var mstream = new MemoryStream(compressedBytes)) using (var mstream = new MemoryStream(compressedBytes))
@ -176,12 +168,22 @@ namespace Unity_Studio
} }
assetsDatam.Write(uncompressedBytes, 0, uncompressedSize); assetsDatam.Write(uncompressedBytes, 0, uncompressedSize);
} }
else if(flag == 1)//LZMA
{
var uncompressedBytes = new byte[uncompressedSize];
using (var mstream = new MemoryStream(compressedBytes))
{
var decoder = SevenZip.Compression.LZMA.SevenZipHelper.StreamDecompress(mstream);
decoder.Read(uncompressedBytes, 0, uncompressedSize);
decoder.Dispose();
}
assetsDatam.Write(uncompressedBytes, 0, uncompressedSize);
}
else else
{ {
assetsDatam.Write(compressedBytes, 0, compressedSize); assetsDatam.Write(compressedBytes, 0, compressedSize);
} }
} }
//assetsDatam.Capacity = (int)assetsDatam.Length;
assetsData = new EndianStream(assetsDatam, EndianType.BigEndian); assetsData = new EndianStream(assetsDatam, EndianType.BigEndian);
using (assetsData) using (assetsData)
{ {
@ -191,7 +193,7 @@ namespace Unity_Studio
MemoryAssetsFile memFile = new MemoryAssetsFile(); MemoryAssetsFile memFile = new MemoryAssetsFile();
var entryinfo_offset = entryinfo.ReadInt64(); var entryinfo_offset = entryinfo.ReadInt64();
var entryinfo_size = entryinfo.ReadInt64(); var entryinfo_size = entryinfo.ReadInt64();
unknown = entryinfo.ReadInt32(); var unknown = entryinfo.ReadInt32();
memFile.fileName = entryinfo.ReadStringToNull(); memFile.fileName = entryinfo.ReadStringToNull();
assetsData.Position = entryinfo_offset; assetsData.Position = entryinfo_offset;
byte[] buffer = new byte[entryinfo_size]; byte[] buffer = new byte[entryinfo_size];