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)); }