<p>正如其他人所提到的,在c#版本中添加该标题是一个不同的事实</p>
<p>同样,请注意,gzip过程可以通过多种方式完成。例如,在C#中,可以指定<code>CompressionLevel</code>的<code>Optimal</code>、<code>Fastest</code>或<code>NoCompression</code>。见:<a href="https://docs.microsoft.com/en-us/dotnet/api/system.io.compression.compressionlevel?view=net-5.0" rel="nofollow noreferrer">https://docs.microsoft.com/en-us/dotnet/api/system.io.compression.compressionlevel?view=net-5.0</a></p>
<p>我对Python还不太熟悉,无法说明默认情况下它将如何处理gzip压缩(也许C#中的<code>Fastest</code>提供了比Python更具攻击性的算法)</p>
<p>这是您的C#代码,标题值设置为“0”,并使用3<code>CompressionLevels</code>进行输出。请注意,它输出的字符串值“非常接近”Python中的值</p>
<p>您还应该问,值的不同是否真的很重要。只要你能编解码就够了吗</p>
<pre><code>using System;
using System.IO;
using System.IO.Compression;
using System.Text;
public class Program
{
public static void Main()
{
string data = "Hello World!";
Console.WriteLine( Compression.CompressData(data, CompressionLevel.Fastest) );
Console.WriteLine( Compression.CompressData(data, CompressionLevel.NoCompression) );
Console.WriteLine( Compression.CompressData(data, CompressionLevel.Optimal) );
// result would be DAAAAB+LCAAAAAAABADzSM3JyVcIzy/KSVEEAKMcKRwMAAAA
// but I get H4sIACwuuWAC//NIzcnJVwjPL8pJUQQAoxwpHAwAAAA=
}
}
public class Compression
{
#region Member Variables
/// <summary>The compressed message header length.</summary>
private const int CompressedMessageHeaderLength = 0; // changed to zero
#endregion
#region Methods
/// <summary>Compresses the XML string.</summary>
/// <param name="documentToCompress">The XML string to compress.</param>
public static string CompressData(string data, CompressionLevel compressionLevel)
{
using (MemoryStream memoryStream = new MemoryStream())
{
byte[] plainBytes = Encoding.UTF8.GetBytes(data);
using (GZipStream zipStream = new GZipStream(memoryStream, compressionLevel, leaveOpen: true))
{
zipStream.Write(plainBytes, 0, plainBytes.Length);
}
memoryStream.Position = 0;
byte[] compressedBytes = new byte[memoryStream.Length + CompressedMessageHeaderLength];
Buffer.BlockCopy(
BitConverter.GetBytes(plainBytes.Length),
0,
compressedBytes,
0,
CompressedMessageHeaderLength
);
// Add the header, which is the length of the compressed message.
memoryStream.Read(compressedBytes, CompressedMessageHeaderLength, (int)memoryStream.Length);
string compressedXml = Convert.ToBase64String(compressedBytes);
return compressedXml;
}
}
#endregion
}
</code></pre>
<p>输出:</p>
<blockquote>
<p>H4sIAAAAAAAEA/NIzcnJVwjPL8pJUQQAoxwpHAwAAAA=
H4sIAAAAAAAEAwEMAPP/SGVsbG8gV29ybGQhoxwpHAwAAAA=
H4sIAAAAAAAAA/NIzcnJVwjPL8pJUQQAoxwpHAwAAAA=</p>
</blockquote>
<p>及在:<a href="https://dotnetfiddle.net/TI8gwM" rel="nofollow noreferrer">https://dotnetfiddle.net/TI8gwM</a></p>