示例#1
0
        private async Task <ByteArrayReader> decompressChunks()
        {
            int start = CompressedChunks.Min(ch => ch.UncompressedOffset);

            int totalSize = CompressedChunks.SelectMany(ch => ch.Header.Blocks).Aggregate(start, (total, block) => total + block.UncompressedSize);

            byte[] data = new byte[totalSize];

            foreach (DomainCompressedChunk chunk in CompressedChunks)
            {
                byte[] chunkData = new byte[chunk.Header.Blocks.Sum(block => block.UncompressedSize)];

                int uncompressedOffset = 0;

                foreach (DomainCompressedChunkBlock block in chunk.Header.Blocks)
                {
                    if (((CompressionTypes)CompressionFlags & CompressionTypes.LZO_ENC) > 0)
                    {
                        await block.CompressedData.Decrypt();
                    }

                    byte[] decompressed = await block.CompressedData.Decompress(block.UncompressedSize);

                    int offset = uncompressedOffset;

                    await Task.Run(() => Array.ConstrainedCopy(decompressed, 0, chunkData, offset, block.UncompressedSize));

                    uncompressedOffset += block.UncompressedSize;
                }

                await Task.Run(() => Array.ConstrainedCopy(chunkData, 0, data, chunk.UncompressedOffset, chunk.Header.UncompressedSize));
            }

            return(ByteArrayReader.CreateNew(data, start));
        }
示例#2
0
        public override int GetBuilderSize()
        {
            if (CompressedChunks.Any())
            {
                throw new NotSupportedException("Cannot rebuild compressed files. Yet.");
            }

            if (Signature == Signatures.EncryptedSignature)
            {
                throw new NotSupportedException("Cannot rebuild fully encrypted files. Yet.");
            }

            BuilderSize = sizeof(uint) * 7
                          + sizeof(ushort) * 2
                          + sizeof(int) * 10
                          + Group.GetBuilderSize()
                          + Guid.Length
                          + GenerationTable.Sum(gen => gen.GetBuilderSize());

            BuilderNameTableOffset = BuilderSize;

            BuilderSize += NameTable.Sum(name => name.GetBuilderSize());

            BuilderImportTableOffset = BuilderSize;

            BuilderSize += ImportTable.Sum(import => import.GetBuilderSize());

            BuilderExportTableOffset = BuilderSize;

            BuilderSize += ExportTable.Sum(export => export.GetBuilderSize());

            BuilderDependsTableOffset = BuilderSize;

            BuilderSize += DependsTable.Length;

            ExportTable.Aggregate(BuilderSize, (current, export) => current + export.GetObjectSize(current));

            return(BuilderSize);
        }