예제 #1
0
        private bool PackFile(ref DataBuffer dest, int index, byte[] data, bool compress)
        {
            if (!compress)
            {
                if (dest.Location + data.Length >= dest.Buffer.Length)
                {
                    byte[] nbuffer = new byte[(dest.Buffer.Length + data.Length) / 1024 * 1024 + 4096];
                    Array.Copy(dest.Buffer, nbuffer, dest.Buffer.Length);
                    dest.Buffer = nbuffer;
                }

                FileLocations[index]       = dest.Location;
                CompressedFileSizes[index] = UncompressedFileSizes[index];
                dest.Write(data);
                return(true);
            }
            else
            {
                //using streams is really stupid
                MemoryStream      ms     = new MemoryStream();
                BZip2OutputStream output = new BZip2OutputStream(ms, 1);
                output.Write(data, 0, data.Length);
                output.Close();
                byte[] compressed = ms.ToArray();
                CompressedFileSizes[index] = (int)output.BytesWritten;

                if (dest.Location + CompressedFileSizes[index] >= dest.Buffer.Length)
                {
                    byte[] nbuffer = new byte[(dest.Buffer.Length + CompressedFileSizes[index]) + 4096];
                    Array.Copy(dest.Buffer, nbuffer, dest.Buffer.Length);
                    dest.Buffer = nbuffer;
                }

                dest.Write(compressed, 0, compressed.Length);
            }

            return(true);
        }
예제 #2
0
        public bool RewriteArchive()
        {
            DataBuffer data_buffer = new DataBuffer(new byte[8192]);

            for (int i = 0; i < FileCount; i++)
            {
                if (FileBuffers[i] == null)
                {
                    ExtractFile(i);
                }
                PackFile(ref data_buffer, i, FileBuffers[i], !ArchiveDecompressed);
            }

            DataBuffer header = new DataBuffer(new byte[2 + FileCount * 10]);

            header.WriteShort(FileCount);
            for (int i = 0; i < FileCount; i++)
            {
                header.WriteInteger(FileNames[i]);
                header.Write3Bytes(UncompressedFileSizes[i]);
                header.Write3Bytes(CompressedFileSizes[i]);
                //pos += CompressedFileSizes[i];
            }


            if (ArchiveDecompressed)
            {
                DataBuffer d = new DataBuffer(new byte[data_buffer.Buffer.Length + header.Buffer.Length]);
                //d.Write3Bytes(data_buffer.Buffer.Length);
                //d.Write3Bytes(0);
                d.Write(header.Buffer, 0, header.Location);
                d.Write(data_buffer.Buffer, 0, data_buffer.Location);
                MemoryStream      ms = new MemoryStream();
                BZip2OutputStream os = new BZip2OutputStream(ms, 1);
                os.Write(d.Buffer, 0, d.Location);
                os.Close();

                byte[]     c     = ms.GetBuffer();
                DataBuffer final = new DataBuffer(new byte[os.BytesWritten + 6]);
                final.Write3Bytes(d.Buffer.Length);
                final.Write3Bytes(os.BytesWritten);
                final.Write(c, 0, os.BytesWritten);
                MainBuffer = final.Buffer;
            }
            else
            {
                DataBuffer final = new DataBuffer(new byte[data_buffer.Buffer.Length + header.Buffer.Length + 100000]);
                final.Write3Bytes(data_buffer.Buffer.Length);
                if (ArchiveDecompressed)
                {
                    final.Write3Bytes(0);
                }
                else
                {
                    final.Write3Bytes(data_buffer.Buffer.Length);
                }
                final.Write(header.Buffer, 0, header.Location);
                final.Write(data_buffer.Buffer, 0, data_buffer.Location);
                MainBuffer = final.Buffer;
            }
            LoadBuffer(MainBuffer);

            return(true);
        }