From 8a61f01e1b337bda94325b24f7cbe1662d72cb16 Mon Sep 17 00:00:00 2001 From: Matt Nadareski Date: Sat, 31 Dec 2022 11:35:22 -0800 Subject: [PATCH] Handle last blocks more efficiently --- BurnOutSharp.Compression/MSZIP.cs | 4 ++-- BurnOutSharp.Wrappers/MicrosoftCabinet.cs | 14 +++++++------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/BurnOutSharp.Compression/MSZIP.cs b/BurnOutSharp.Compression/MSZIP.cs index aaeee46c..b1b43efa 100644 --- a/BurnOutSharp.Compression/MSZIP.cs +++ b/BurnOutSharp.Compression/MSZIP.cs @@ -19,9 +19,9 @@ namespace BurnOutSharp.Compression /// /// Decompress MSZIP data block /// - public byte[] DecompressMSZIPData(byte[] data, byte[] previousBlock = null) + public byte[] DecompressMSZIPData(byte[] data, bool previousBlock = false) { - if (previousBlock != null) + if (previousBlock) _inflater.Reset(); _inflater.SetInput(buffer: data, 2, data.Length - 2); diff --git a/BurnOutSharp.Wrappers/MicrosoftCabinet.cs b/BurnOutSharp.Wrappers/MicrosoftCabinet.cs index 65786dd5..827ded85 100644 --- a/BurnOutSharp.Wrappers/MicrosoftCabinet.cs +++ b/BurnOutSharp.Wrappers/MicrosoftCabinet.cs @@ -217,19 +217,19 @@ namespace BurnOutSharp.Wrappers // Store the last decompressed block for MS-ZIP Compression.MSZIP mszip = new Compression.MSZIP(); - byte[] lastDecompressed = null; + bool hasLastBlock = false; List data = new List(); foreach (var dataBlock in folder.DataBlocks) { - byte[] decompressed = null; + byte[] decompressed; switch (folder.CompressionType & Models.MicrosoftCabinet.CompressionType.MASK_TYPE) { case Models.MicrosoftCabinet.CompressionType.TYPE_NONE: decompressed = dataBlock.CompressedData; break; case Models.MicrosoftCabinet.CompressionType.TYPE_MSZIP: - decompressed = mszip.DecompressMSZIPData(dataBlock.CompressedData, lastDecompressed); + decompressed = mszip.DecompressMSZIPData(dataBlock.CompressedData, hasLastBlock); break; case Models.MicrosoftCabinet.CompressionType.TYPE_QUANTUM: // TODO: UNIMPLEMENTED @@ -245,9 +245,8 @@ namespace BurnOutSharp.Wrappers return null; } - lastDecompressed = decompressed; - if (decompressed != null) - data.AddRange(decompressed); + hasLastBlock = true; + data.AddRange(decompressed ?? new byte[0]); } return data.ToArray(); @@ -468,7 +467,8 @@ namespace BurnOutSharp.Wrappers Console.WriteLine($" Folder {i}"); Console.WriteLine($" Cab start offset = {entry.CabStartOffset}"); Console.WriteLine($" Data count = {entry.DataCount}"); - Console.WriteLine($" Compression type = {entry.CompressionType} ({entry.CompressionType & Models.MicrosoftCabinet.CompressionType.MASK_TYPE})"); + Console.WriteLine($" Compression type = {entry.CompressionType}"); + Console.WriteLine($" Masked compression type = {entry.CompressionType & Models.MicrosoftCabinet.CompressionType.MASK_TYPE}"); if (entry.ReservedData == null) Console.WriteLine($" Reserved data = [NULL]"); else