在C#中压缩Python解压缩

时间:2015-03-12 10:48:25

标签: c# python gzip zlib

问题

  1. 在python中压缩长字符串4k +
  2. 在C#中解压缩
  3. 我尝试做什么:
    1。蟒

    def deflate_and_base64_encode( string_val ):
        zlibbed_str = zlib.compress( string_val )
        compressed_string = zlibbed_str[2:-1]
        return base64.b64encode(compressed_string )
    

    2。 C#

    public static string Inflate(string pythonZipped)
    {
        byte[] gzBuffer = Convert.FromBase64String(pythonZipped);
        using (var ms = new MemoryStream())
        {
            ms.Write(gzBuffer, 0, gzBuffer.Length);
            var buffer = new byte[ms.Length];
            ms.Position = 0;
            using (var infS = new DeflateStream(ms,Ionic.Zlib.CompressionMode.Decompress, true))
            {
                infS.Read(buffer, 0, buffer.Length);
            }
            return Encoding.UTF8.GetString(buffer);
        }
    }
    

    但是得到一些奇怪的结果,例如:

    Python.deflate_and_base64_encode('1'*1000)

    MzQcBaNgFAx3AABQpr8=

    中的结果

    C#.Inflate("MzQcBaNgFAx3AABQpr8")

    结果为11111111111111而不是1000个

    你能解释一下我做错了什么或给我其他方法来实现我的目标吗?

2 个答案:

答案 0 :(得分:0)

问题开始时,从开头的2个字符和从最后的一个字符被切断。 compressed_string = zlibbed_str[2:-1]

这行代码会破坏前2个字符中的标题信息,即使是立即的zlib.decompress也无法理解剩下的内容。 (我的猜测:C#的zlib实现尽力重建没有有效头的流的左边.Python' s,正如你在下面看到的那样,更严格。)

>>> import zlib
>>> z = zlib.compress('1'*1000)
>>> c = z[2:-1]
>>> zlib.decompress(z)
'1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111'
>>> zlib.decompress(c)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
zlib.error: Error -3 while decompressing data: incorrect header check

答案 1 :(得分:0)

我遇到了同样的问题。 我解决了。

“var buffer = new byte [ ms.Length ];”导致这个问题。

缓冲区大小太小。

增加缓冲区大小,例如“var buffer = new byte [ 4096 ];” 或“var buffer = new byte [ ms.Length * 1024 ];”。