diff --git a/AssetStudio/BundleFile.cs b/AssetStudio/BundleFile.cs index a48fec4..c5385bb 100644 --- a/AssetStudio/BundleFile.cs +++ b/AssetStudio/BundleFile.cs @@ -231,7 +231,9 @@ namespace AssetStudio } case 1: //LZMA { - blocksInfoUncompresseddStream = SevenZipHelper.StreamDecompress(blocksInfoCompressedStream); + blocksInfoUncompresseddStream = new MemoryStream((int)(m_Header.uncompressedBlocksInfoSize)); + SevenZipHelper.StreamDecompress(blocksInfoCompressedStream, blocksInfoUncompresseddStream, m_Header.compressedBlocksInfoSize, m_Header.uncompressedBlocksInfoSize); + blocksInfoUncompresseddStream.Position = 0; blocksInfoCompressedStream.Close(); break; } diff --git a/AssetStudio/SevenZipHelper.cs b/AssetStudio/SevenZipHelper.cs index c91b096..b06edd3 100644 --- a/AssetStudio/SevenZipHelper.cs +++ b/AssetStudio/SevenZipHelper.cs @@ -34,15 +34,16 @@ namespace AssetStudio return newOutStream; } - public static void StreamDecompress(Stream inStream, Stream outStream, long inSize, long outSize) + public static void StreamDecompress(Stream compressedStream, Stream decompressedStream, long compressedSize, long decompressedSize) { + var basePosition = compressedStream.Position; var decoder = new Decoder(); var properties = new byte[5]; - if (inStream.Read(properties, 0, 5) != 5) + if (compressedStream.Read(properties, 0, 5) != 5) throw new Exception("input .lzma is too short"); decoder.SetDecoderProperties(properties); - inSize -= 5L; - decoder.Code(inStream, outStream, inSize, outSize, null); + decoder.Code(compressedStream, decompressedStream, compressedSize - 5, decompressedSize, null); + compressedStream.Position = basePosition + compressedSize; } } }