C# 用c语言中的zlib.net压缩和解压字符串#
我在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
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!仅仅提供代码并不是一个理想的答案,因为提问者无法从中学习。请添加一些上下文和注释,以解释您正在做什么以及为什么!