C# 用c语言中的zlib.net压缩和解压字符串#

C# 用c语言中的zlib.net压缩和解压字符串#,c#,zlib,C#,Zlib,我在c#中使用zlib.net压缩和解压缩字符串 这是我的密码 class GZOutputStream : ZOutputStream { public GZOutputStream(Stream in_Renamed) : base(in_Renamed) { byte[] dictionary = System.Text.ASCIIEncoding.ASCII.GetBytes(sDictionary); z.inflateSetDictio

我在c#中使用zlib.net压缩和解压缩字符串

这是我的密码

class GZOutputStream : ZOutputStream
{
    public GZOutputStream(Stream in_Renamed) : base(in_Renamed)
    {
        byte[] dictionary = System.Text.ASCIIEncoding.ASCII.GetBytes(sDictionary);
        z.inflateSetDictionary(dictionary, dictionary.Length);
    }

    public GZOutputStream(Stream in_Renamed, int level) : base(in_Renamed, level)
    {
        byte[] dictionary = System.Text.ASCIIEncoding.ASCII.GetBytes(sDictionary);
        z.deflateSetDictionary(dictionary, dictionary.Length);
    }
}

public static byte[] compressString(string source)
{ 
    byte[] buffer = System.Text.Encoding.Default.GetBytes (source);

    MemoryStream memOutput = new MemoryStream ();
    GZOutputStream zipOut   = new GZOutputStream(memOutput, zlibConst.Z_DEFAULT_COMPRESSION);

    zipOut.Write(buffer, 0, buffer.Length);
    zipOut.finish();

    memOutput.Seek(0, SeekOrigin.Begin);
    byte[] result = memOutput.ToArray();

    return result;
}

public static byte[] deCompressString(string source)
{ 
    byte[] buffer = System.Text.Encoding.Default.GetBytes (source);
    MemoryStream memOutput = new MemoryStream ();
    GZOutputStream zipOut   = new GZOutputStream(memOutput);

    zipOut.Write(buffer, 0, buffer.Length);
    zipOut.finish();

    memOutput.Seek(0, SeekOrigin.Begin);
    byte[] result = memOutput.ToArray();

    return result;
}
压缩字符串时,效果很好。但是,当我解压缩compress函数的结果字符串时,出现了一个异常:

ZStreamException:正在充气:
zlib.ZOutputStream.Write(System.Byte[]b1,Int32 off,Int32 len)


那么解决方法是什么呢?

5年前的问题,我知道,但对于任何仍在寻找(我也是)的人来说,问题是ZOutputStream中的Write方法在第一次调用Z.inflate后返回zlibConst.Z\u NEED\u DICT,这时需要提供字典。因此,您需要重写Write方法,测试该返回并在该点提供字典

    public static string DeCompressToString(byte[] buffer)
    {
        MemoryStream memOutput = new MemoryStream();
        ZOutputStream zipOut = new ZOutputStream(memOutput);

        zipOut.Write(buffer, 0, buffer.Length);
        zipOut.finish();

        memOutput.Seek(0, SeekOrigin.Begin);
        byte[] result = memOutput.ToArray();

        var str = System.Text.Encoding.Default.GetString(result);

        return str;
    }
public override void Write(System.Byte[] b1, int off, int len)
    {
        if (len == 0)
            return;
        int err;
        
        z.next_in = b1;
        z.next_in_index = off;
        z.avail_in = len;
        do
        {
            z.next_out = buf;
            z.next_out_index = 0;
            z.avail_out = bufsize;
            if (compress)
                err = z.deflate(flush_Renamed_Field);
            else
                err = z.inflate(flush_Renamed_Field);

            if (err == zlibConst.Z_NEED_DICT)
            {
                int y=z.inflateSetDictionary(dict, dict.Length);
                err = z.inflate(flush_Renamed_Field);
            }

            if (err != zlibConst.Z_OK && err != zlibConst.Z_STREAM_END)
            {
                throw new ZStreamException((compress ? "de" : "in") + "flating: " + z.msg);
            }
            ms.Write(buf, 0, bufsize - z.avail_out);
        }
        while (z.avail_in > 0 || z.avail_out == 0);
    }
   
}

解压字符串时会出现什么异常?ZStreamException:inflating:zlib.ZOutputStream.Write(System.Byte[]b1,Int32 off,Int32 len)除了异常中返回的信息(即实际问题是什么)之外,没有其他信息了?只有ZStreamException。我无法解压缩到目标字符串。什么是sDictionary?以上代码无法编译。欢迎使用StackOverflow!仅仅提供代码并不是一个理想的答案,因为提问者无法从中学习。请添加一些上下文和注释,以解释您正在做什么以及为什么!