From 44b02b92d851ef4eafa5b0a435e6894a1dc64273 Mon Sep 17 00:00:00 2001 From: Perfare Date: Thu, 27 May 2021 03:46:15 +0800 Subject: [PATCH] fix lzma decompression --- AssetStudio/BundleFile.cs | 4 +++- AssetStudio/SevenZipHelper.cs | 9 +++++---- 2 files changed, 8 insertions(+), 5 deletions(-) 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; } } }