public static byte[] Compress(byte[] b)
 {
     using (var compressor = new ZstdNet.Compressor())
     {
         return(compressor.Wrap(b));
     }
 }
示例#2
0
        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());
        }
示例#3
0
文件: Compress.cs 项目: zorbathut/dec
        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();
            }
        }
示例#4
0
        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);
        }
示例#5
0
 public ZstdCompressor(int compressionLevel) : base(compressionLevel)
 {
     BaseCompressor = new ZstdNet.Compressor(new ZstdNet.CompressionOptions(CompressionLevel));
 }