Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用zlib python从未压缩字符串中恢复压缩字符串?_C#_Python 3.x_Zlib - Fatal编程技术网

C# 如何使用zlib python从未压缩字符串中恢复压缩字符串?

C# 如何使用zlib python从未压缩字符串中恢复压缩字符串?,c#,python-3.x,zlib,C#,Python 3.x,Zlib,我有一个压缩字符串“h4siaaaaaaeactmygbizmhjkahtalxiaaaaaaaaaaa”,它是由C#code生成的。我尝试使用zlib对其进行解压缩,如下所示: c = zlib.decompress(base64.b64decode("H4sIAAAAAAAEACtmyGBIZMhjKAHTALXiaIAOAAAA"), 16 + zlib.MAX_WBITS) print(c) print(c.decode('utf-8')) 上述代码片段的输出为:s

我有一个压缩字符串
“h4siaaaaaaeactmygbizmhjkahtalxiaaaaaaaaaaa”
,它是由C#code生成的。我尝试使用zlib对其进行解压缩,如下所示:

c = zlib.decompress(base64.b64decode("H4sIAAAAAAAEACtmyGBIZMhjKAHTALXiaIAOAAAA"), 16 + zlib.MAX_WBITS)
print(c)
print(c.decode('utf-8'))
上述代码片段的输出为:
shantha

现在,如何使用zlib从原始字符串“shantha”中获取压缩字符串“h4siaaaaaaeactmygbizmhjkahtalxiaaaaaaaaaaa”

编辑: 创建压缩字符串的C代码:

using System.IO;
using System;
using System.IO.Compression;
using System.Text;

public class Program
{
    public static void Main(string[] args)
    {

        string plainText = "shantha";
        byte[] buffer = Encoding.UTF8.GetBytes(plainText);  
        var memoryStream = new MemoryStream();

        using (var gZipStream = new GZipStream(memoryStream, compressionMode.Compress, true))
        {
            gZipStream.Write(buffer, 0, buffer.Length);
        }
        memoryStream.Position = 0;
        var compressedData = new byte[memoryStream.Length];
        memoryStream.Read(compressedData, 0, compressedData.Length);
        var gZipBuffer = new byte[compressedData.Length];
        Buffer.BlockCopy(compressedData, 0, gZipBuffer, 0, compressedData.Length);
        Console.WriteLine(Convert.ToBase64String(gZipBuffer));
    }
}
这不是“珊莎”。该Base-64编码的zlib流解码为
b“s\0h\0a\0n\0t\0h\0a\0”
。有一堆空字符散布在打印时不显示的字符中。(根据汉普斯的评论,这可能是因为在压缩之前将字符串编码为UTF-16。)

您的原始字符串是gzip编码的,而不是zlib。因此,您需要使用
zlib.compressobj
wbits=31
来生成zlib格式。示例,包括编码为UTF-16、小尾端、键入交互式Python:

>>> import zlib
>>> import base64
>>> s = "shantha".encode('utf-16le')
>>> z = zlib.compressobj(wbits=31)
>>> c = z.compress(s)
>>> c += z.flush(zlib.Z_FINISH)
>>> base64.b64encode(c)
b'H4sIAAAAAAAAEytmyGBIZMhjKAHTALXiaIAOAAAA'

生成的gzip头可能略有不同,正如这里所示,这取决于您运行的操作系统和压缩级别。此外,对于较大的输入和其他压缩级别或软件版本,压缩数据也可能有所不同。但这并不重要。重要的是,当你解压时,你会得到原始数据。

你的代码在我这边返回
s h a n t h a
c.decode(“utf-16”)
但是返回
shantha
。我很难尝试将字符串编码回正确的压缩。你没有创建压缩字符串本身的代码吗?我有。但它是用C#写的。把它贴出来。“如果代码是链接的,你可以在同一个问题中询问两种语言,就像这样。”汉普斯·拉尔森-发帖了!不过,
16+zlib.MAX_WBITS
不是已经
31
了吗?另外,“空值”的存在是因为它是一个
utf-16le
字符串,而不是他试图将其解码为的“utf-8”。是的,但这是在他们的解压示例中,有趣的是,它甚至不需要。(
decompress
将检测gzip格式,并在没有该选项的情况下解压。)如果他们想制作这样的压缩流,他们需要使用
31
(或者
16+zlib.MAX\u WBITS
)。但是,Python中的
compress
没有这个选项!(不知道为什么没有)因此,他们必须使用回答中提到的
compressobj
接口。啊,我不知道为什么那里有那么多空值。谢谢。@MarkAdler-可以在这里添加wbits=31的zlib.compressobj的示例来生成zlib格式吗?使用gzip,我们应该能够正确获取此字符串?-“H4SiaaaaaaeActMygbizmhjkahTalxiaaaaaaaaa“