mirror of
https://github.com/aelurum/AssetStudio.git
synced 2025-05-25 05:40:21 -04:00
support the 'UnityFS' asset bundle type with LZMA compression (not tested)
This commit is contained in:
parent
ff144b41eb
commit
56825b5e48
@ -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];
|
||||||
|
Loading…
Reference in New Issue
Block a user