public byte[] GetFileFromIndex(int index)
        {
            FileListTab          file       = Table20.FileList[index];
            string               name       = file.Path.GetText();
            DirectoryListTab     dir        = file.Directory;
            DirectoryOffsetTable dirOffset  = dir.DirOffset;
            FileOffsetTab        offsetInfo = file.FileOffset;

            bool isLink = false;

            if (file.IsLink)
            {
                isLink = true;

                while (file.IsLink)
                {
                    file = file.FileOffset.File;
                }

                dir        = file.Directory;
                dirOffset  = dir.DirOffset;
                offsetInfo = file.FileOffset;
            }

            if (offsetInfo.Flag3)
            {
                dirOffset  = offsetInfo.LinkedDirOffset;
                offsetInfo = offsetInfo.LinkedOffset;
            }

            if (isLink)
            {
                return(new byte[0]);
            }
            if (offsetInfo.Size == 0)
            {
                return(new byte[0]);
            }

            long offset = Header.Field10 + dirOffset.Offset + offsetInfo.Offset * 4;

            var data = new byte[offsetInfo.Size];

            Stream.Position = offset;

            if (offsetInfo.SizeCompressed == 0 || offsetInfo.SizeCompressed == offsetInfo.Size)
            {
                Stream.Read(data, 0, offsetInfo.Size);
            }
            else
            {
                using (var compStream = new ZstandardStream(Stream, CompressionMode.Decompress, true))
                {
                    compStream.Read(data, 0, offsetInfo.Size);
                }
            }

            return(data);
        }
 private Span <byte> DecompressBlock(IStorage input)
 {
     // decompress
     using (var decompressionStream = new ZstandardStream(input.AsStream(), CompressionMode.Decompress))
     {
         decompressionStream.Read(decompressBuff, 0, bs);
         return(new Span <byte>(decompressBuff));
     }
 }
        private (byte[] table20, byte[] table28) GetTables()
        {
            var reader = new BinaryReader(Stream);

            reader.BaseStream.Position = Header.Field20;

            if (reader.ReadInt32() < 0x100) // heuristic for detecting compressed tables
            {
                reader.BaseStream.Position = Header.Field20;
                var header20 = new CompressedTableHeader(reader);
                var table20  = new byte[header20.Size];

                reader.BaseStream.Position = Header.Field28;
                var header28 = new CompressedTableHeader(reader);
                var table28  = new byte[header28.Size];

                reader.BaseStream.Position = Header.Field20 + header20.DataOffset;

                using (var compStream = new ZstandardStream(Stream, CompressionMode.Decompress, true))
                {
                    compStream.Read(table20, 0, table20.Length);
                }

                reader.BaseStream.Position = Header.Field28 + header28.DataOffset;

                using (var compStream = new ZstandardStream(Stream, CompressionMode.Decompress, true))
                {
                    compStream.Read(table28, 0, table28.Length);
                }

                return(table20, table28);
            }
            else
            {
                reader.BaseStream.Position = Header.Field20;
                int table20Length = reader.ReadInt32();

                reader.BaseStream.Position = Header.Field20;
                byte[] table20 = reader.ReadBytes(table20Length);

                reader.BaseStream.Position = Header.Field28;
                int table28Length = reader.ReadInt32();

                reader.BaseStream.Position = Header.Field28;
                byte[] table28 = reader.ReadBytes(table28Length);

                return(table20, table28);
            }
        }
        public static LeaderboardData FromCompressedData(byte[] compressedBuffer)
        {
            Program.Log("Decompressing...");
            byte[]          data = new byte[LENGTH_DATA];
            MemoryStream    ms   = new MemoryStream(compressedBuffer);
            ZstandardStream zs   = new ZstandardStream(ms, System.IO.Compression.CompressionMode.Decompress);
            int             read = zs.Read(data, 0, LENGTH_DATA);

            if (zs.ReadByte() != -1)
            {
                throw new Exception("Decompressed data continues beyond LENGTH_DATA!");
            }
            zs.Close();
            ms.Close();
            Program.Log("Finished decompression.");
            return(FromRawData(data));
        }