示例#1
0
        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;
            }
        }
示例#2
0
        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);
        }
示例#3
0
文件: Reader.cs 项目: Gl0/GPK_RePack
        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);
        }