public void GenerateChunkHeaders(int dataSize, int dataStartOffset, byte[] buffer) { int chunkheadercount = (dataSize / Constants.DEFAULT_CHUNKSIZE) + 1; int oldChunkheadercount = Header.ChunkHeaders.Count(); Header.ChunkHeaders.Clear(); int bufferOffset = dataStartOffset; int endOfData = dataStartOffset + dataSize; for (int i = 0; i < chunkheadercount; i++) { var chunkHeader = new GpkCompressedChunkHeader(); chunkHeader.UncompressedOffset = bufferOffset; var chunkData = new PackageChunkBlock(); chunkData.signature = Constants.DEFAULT_SIGNATURE; chunkData.blocksize = Constants.DEFAULT_BLOCKSIZE; if (bufferOffset + Constants.DEFAULT_CHUNKSIZE > endOfData) { //ending chunkData.uncompressedSize_chunkheader = endOfData - bufferOffset; } else { chunkData.uncompressedSize_chunkheader = Constants.DEFAULT_CHUNKSIZE; } //chunks has blocks int blockCount = Convert.ToInt32(Math.Ceiling(chunkData.uncompressedSize_chunkheader / (double)chunkData.blocksize)); byte[] uncompressedChunkData = new byte[chunkData.uncompressedSize_chunkheader]; Array.ConstrainedCopy(buffer, bufferOffset, uncompressedChunkData, 0, chunkData.uncompressedSize_chunkheader); chunkData.Compress(uncompressedChunkData, blockCount, Constants.DEFAULT_BLOCKSIZE, Header.CompressionFlags); //set final data chunkHeader.writableChunkblock = chunkData; chunkHeader.UncompressedSize = chunkData.uncompressedSize_chunkheader; Header.ChunkHeaders.Add(chunkHeader); //END bufferOffset += chunkData.uncompressedSize_chunkheader; } }
private byte[] CheckAndDecompress(BinaryReader reader, GpkPackage package) { logger.Trace("checkAndDecompress start"); if (package.Header.ChunkHeaders.Count == 0) { return(null); } byte[] completeFile = new byte[package.UncompressedSize]; //should be the complete file size for (int i = 0; i < package.Header.ChunkHeaders.Count; i++) { GpkCompressedChunkHeader header = package.Header.ChunkHeaders[i]; reader.BaseStream.Seek(header.CompressedOffset, SeekOrigin.Begin); PackageChunkBlock chunk = new PackageChunkBlock(); chunk.signature = reader.ReadInt32(); chunk.blocksize = reader.ReadInt32(); chunk.compressedSize = reader.ReadInt32(); chunk.uncompressedSize_chunkheader = reader.ReadInt32(); int blockCount = Convert.ToInt32(Math.Ceiling(chunk.uncompressedSize_chunkheader / (double)chunk.blocksize)); byte[] uncompressedBytes = new byte[header.UncompressedSize]; chunk.Decompress(uncompressedBytes, blockCount, reader, package.Header.CompressionFlags); Array.ConstrainedCopy(uncompressedBytes, 0, completeFile, header.UncompressedOffset, header.UncompressedSize); logger.Trace("ChunkData {0}: BlockCount {1}, BlockSize {2}, compressedSize {3}, uncompressedSize_chunkheader {4}", i, blockCount, chunk.blocksize, chunk.compressedSize, chunk.uncompressedSize_chunkheader); } if (CoreSettings.Default.Debug) { //dump uncompressed file string path = String.Format("{0}\\decomp_{1}", Directory.GetCurrentDirectory(), package.Filename); //Task.Factory.StartNew(() => File.WriteAllBytes(path, completeFile)); } return(completeFile); }
private byte[] CheckAndDecompress(BinaryReader reader, GpkPackage package) { logger.Trace("checkAndDecompress start"); if (package.Header.ChunkHeaders.Count == 0) { return(null); } byte[] completeFile = new byte[package.UncompressedSize]; //should be the complete file size foreach (var header in package.Header.ChunkHeaders) { reader.BaseStream.Seek(header.CompressedOffset, SeekOrigin.Begin); PackageChunkBlock block = new PackageChunkBlock(); block.signature = reader.ReadInt32(); block.blocksize = reader.ReadInt32(); block.compressedSize = reader.ReadInt32(); block.uncompressedSize_chunkheader = reader.ReadInt32(); int chunkCount = (block.uncompressedSize_chunkheader + block.blocksize - 1) / block.blocksize; byte[] uncompressedBytes = new byte[header.UncompressedSize]; block.Decompress(uncompressedBytes, chunkCount, reader, package.Header.CompressionFlags); Array.ConstrainedCopy(uncompressedBytes, 0, completeFile, header.UncompressedOffset, header.UncompressedSize); } if (Settings.Default.Debug) { //dump uncompressed file string path = String.Format("{0}\\decomp_{1}", Directory.GetCurrentDirectory(), package.Filename); Task.Factory.StartNew(() => File.WriteAllBytes(path, completeFile)); } return(completeFile); }