因此,我想利用Brotli的优势,但是我对Python和C++不熟悉。

我知道有人已经将其编译为Windows .exe。但是,如何将其包装到DLL或.NET应用程序可以引用的东西中?我知道有IronPython,我是否只是将所有源文件引入IronPython项目中并编写一个.NET适配器来调用Brotli API并将其公开?但是实际上,我什至不确定Brotli API是Python还是C++。

查看tools/bro.cc,似乎在encode.cdecode.c中将“entry”方法定义为BrotliCompress()BrotliDecompressBuffer()BrotliDecompressStream()方法。因此,我认为可以从C++类编译DLL。

最佳答案

您可以使用Brotli.NET,它提供完整的流支持。

  • github:https://github.com/XieJJ99/brotli.net/
  • Nuget:https://www.nuget.org/packages/Brotli.NET/

  • 要将流压缩为brotli数据,请执行以下操作:
       public Byte[] Encode(Byte[] input)
       {
           Byte[] output = null;
           using (System.IO.MemoryStream msInput = new System.IO.MemoryStream(input))
           using (System.IO.MemoryStream msOutput = new System.IO.MemoryStream())
           using (BrotliStream bs = new BrotliStream(msOutput, System.IO.Compression.CompressionMode.Compress))
           {
               bs.SetQuality(11);
               bs.SetWindow(22);
               msInput.CopyTo(bs);
               bs.Close();
               output = msOutput.ToArray();
               return output;
           }
       }
    

    要解压缩brotli流:
       public Byte[] Decode(Byte[] input)
       {
           using (System.IO.MemoryStream msInput = new System.IO.MemoryStream(input))
           using (BrotliStream bs = new BrotliStream(msInput, System.IO.Compression.CompressionMode.Decompress))
           using (System.IO.MemoryStream msOutput = new System.IO.MemoryStream())
           {
               bs.CopyTo(msOutput);
               msOutput.Seek(0, System.IO.SeekOrigin.Begin);
               output = msOutput.ToArray();
               return output;
           }
    
       }
    

    要在Web应用程序中支持动态压缩,请在Global.asax.cs中添加如下代码:
        protected void Application_PostAcquireRequestState(object sender, EventArgs e)
        {
                           var app = Context.ApplicationInstance;
                String acceptEncodings = app.Request.Headers.Get("Accept-Encoding");
    
                if (!String.IsNullOrEmpty(acceptEncodings))
                {
                    System.IO.Stream baseStream = app.Response.Filter;
                    acceptEncodings = acceptEncodings.ToLower();
    
                    if (acceptEncodings.Contains("br") || acceptEncodings.Contains("brotli"))
                    {
                        app.Response.Filter = new Brotli.BrotliStream(baseStream, System.IO.Compression.CompressionMode.Compress);
                        app.Response.AppendHeader("Content-Encoding", "br");
                    }
                    else
                    if (acceptEncodings.Contains("deflate"))
                    {
                        app.Response.Filter = new System.IO.Compression.DeflateStream(baseStream, System.IO.Compression.CompressionMode.Compress);
                        app.Response.AppendHeader("Content-Encoding", "deflate");
                    }
                    else if (acceptEncodings.Contains("gzip"))
                    {
                        app.Response.Filter = new System.IO.Compression.GZipStream(baseStream, System.IO.Compression.CompressionMode.Compress);
                        app.Response.AppendHeader("Content-Encoding", "gzip");
                    }
    
                }
           }
    

    09-29 23:54