public static byte[] Compress(byte[] b) { using (var compressor = new ZstdNet.Compressor()) { return(compressor.Wrap(b)); } }
protected override byte[] Compress(MemoryStream uncompressed) { MemoryStream output = new MemoryStream(); output.Write(Header, 0, Header.Length); var comp = new ZstdNet.Compressor(); var compressed = comp.Wrap(uncompressed.ToArray()); output.Write(BitConverter.GetBytes(compressed.Length + 9), 0, 4); output.Write(BitConverter.GetBytes(uncompressed.Length), 0, 4); output.Write(compressed, 0, compressed.Length); return(output.ToArray()); }
public static void WriteToFile(string filename, string data) { if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) { var compressor = new ZstdNet.Compressor(new ZstdNet.CompressionOptions(20)); File.WriteAllBytes(filename + ".zst", compressor.Wrap(System.Text.Encoding.UTF8.GetBytes(data))); } else { // Annoyingly this doesn't currently work on Linux. // TODO: come up with a better solution. File.WriteAllBytes(filename, System.Text.Encoding.UTF8.GetBytes(data)); ProcessStartInfo startInfo = new ProcessStartInfo(); startInfo.FileName = "zstd"; startInfo.Arguments = filename; var process = Process.Start(startInfo); process.WaitForExit(); } }
public void WriteTo(BinaryWriter dataWriter, BinaryWriter metadataWriter, bool asDuplicate) { uint actualsize = 0; uint crc = 0; ulong offset = (ulong)dataWriter.BaseStream.Position; if (!asDuplicate) { using (MemoryStream buffer = new MemoryStream()) using (Stream source = Source.GetStream()) { switch (Compression) { case ArchiveFileCompression.LZ4: using (LZ4Stream lz = new LZ4Stream(buffer, LZ4StreamMode.Compress, LZ4StreamFlags.HighCompression | LZ4StreamFlags.IsolateInnerStream, 4 * 1048576)) source.CopyTo(lz); break; case ArchiveFileCompression.Zstandard: using (ZstdNet.Compressor zstd = new ZstdNet.Compressor(new ZstdNet.CompressionOptions(3))) using (MemoryStream temp = new MemoryStream()) { source.CopyTo(temp); byte[] output = zstd.Wrap(temp.ToArray()); buffer.Write(output, 0, output.Length); } break; case ArchiveFileCompression.Uncompressed: source.CopyTo(buffer); break; default: throw new InvalidOperationException("Compression type is invalid."); } buffer.Position = 0; byte[] bBuffer = buffer.ToArray(); crc = Crc32CAlgorithm.Compute(bBuffer); dataWriter.Write(bBuffer); } long newsize = dataWriter.BaseStream.Position; actualsize = (uint)(newsize - (long)offset); } metadataWriter.Write((byte)Type); metadataWriter.Write((byte)Flags); if (asDuplicate) { metadataWriter.Write((byte)ArchiveFileCompression.Duplicate); } else { metadataWriter.Write((byte)Compression); } metadataWriter.Write((byte)0); //reserved metadataWriter.Write(crc); metadataWriter.Write(Source.Md5); metadataWriter.BaseStream.Seek(48, SeekOrigin.Current); byte[] uName = Encoding.Unicode.GetBytes(Name); metadataWriter.Write((ushort)uName.Length); metadataWriter.Write(uName); metadataWriter.Write(offset); metadataWriter.Write(Source.Size); metadataWriter.Write(actualsize); }
public ZstdCompressor(int compressionLevel) : base(compressionLevel) { BaseCompressor = new ZstdNet.Compressor(new ZstdNet.CompressionOptions(CompressionLevel)); }