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