CSPspEmu.Hle.Formats.Cso.ReadBlocksDecompressed C# (CSharp) Method

ReadBlocksDecompressed() public method

public ReadBlocksDecompressed ( uint Block, int Count ) : ArraySegment[]
Block uint
Count int
return ArraySegment[]
        public ArraySegment<byte>[] ReadBlocksDecompressed(uint Block, int Count)
        {
            if (Block + Count >= NumberOfBlocks)
            {
                Count = (int)(NumberOfBlocks - Block);
            }

            if (Count <= 0)
            {
                return new ArraySegment<byte>[0];
            }
            else
            {
                var Segments = ReadBlocksCompressed(Block, Count);
                for (int n = 0; n < Count; n++)
                {
                    if (Blocks[Block + n].IsCompressed)
                    {
                        Segments[n] = new ArraySegment<byte>(new DeflateStream(
                            new MemoryStream(Segments[n].Array, Segments[n].Offset, Segments[n].Count),
                            CompressionMode.Decompress
                        ).ReadBytes((int)this.Header.BlockSize));
                    }
                }

                return Segments;
            }
        }

Usage Example

Example #1
0
 public void ReadSectorDecompressedTest()
 {
     var Cso = new Cso(File.OpenRead("../../../TestInput/cube.cso"));
     var IsoBytes = File.ReadAllBytes("../../../TestInput/cube.iso");
     int ExpectedNumberOfBlocks = 229;
     int ExpectedBlockSize = 2048;
     Assert.AreEqual(ExpectedNumberOfBlocks, Cso.NumberOfBlocks);
     Assert.AreEqual(ExpectedBlockSize, Cso.BlockSize);
     for (uint Block = 0; Block < ExpectedNumberOfBlocks; Block++)
     {
         var DecompressedBlockData = Cso.ReadBlocksDecompressed(Block, 1)[0];
         CollectionAssert.AreEqual(
             IsoBytes.Skip((int)(ExpectedBlockSize * Block)).Take(ExpectedBlockSize).ToArray(),
             DecompressedBlockData.ToArray()
         );
     }
 }