https://www.hdzikao.com

gzip流的解压问题(今天发现c#在做字符串压缩的时候的一个bug)【c#在做字符串压缩的时候的一个bug】

[导读] 大家好,今天小热关注到一个比较有意思的话题,就是关于GZipStream的问题,于是小编就整理了2个相关介绍GZipStream的解答,让我们一起看看吧。 文章目录: gzip流的解压问题 今天发现c#在做字

gzip流的解压问题(今天发现c#在做字符串压缩的时候的一个bug)【c#在做字符串压缩的时候的一个bug】

大家好,今天小热关注到一个比较有意思的话题,就是关于GZipStream的问题,于是小编就整理了2个相关介绍GZipStream的解答,让我们一起看看吧。

文章目录:

  1. gzip流的解压问题
  2. 今天发现c#在做字符串压缩的时候的一个bug

一、gzip流的解压问题

streamReceive = new GZipStream(streamReceive, CompressionMode.Decompress);//解压gzip流,但有一定的局限性 你是怎么解压的

gzip数据的头(幻数)为1f 8b 08 0000... 从你发的数据里面来看,这个流可能只是一个完整的数据流中间的一部分,而基于流式的压缩解压是必须要知道前文所产生的上下文的,不能从中间进行压缩解压,所以才会报错

引用:

如果有使用Zip.DecompressFile()方法去解压标准的ZIP文件,就会出现以下错误:

GZip 头中的幻数不正确。请确保正在传入 GZip 流。

此外,使用Zip.CompressFile()方法也不能将多个文件放入一个ZIP包。

看来,FCL2.0还是不能处理标准的ZIP文件,我目前是使用第三方的ICSharpZipLib来处理ZIP文件

似乎发现都是用第三方的库比较多

GZIP格式说明

二、今天发现c#在做字符串压缩的时候的一个bug

NO,NO,事实上默认的Default是指你的操作系统当前所使用的编码类型,在中国一般来说是UTF-8

如果你要指定的话可以用Encoding.UTF-8

但是解压的时候也要用同一种编码形式,否则就会出错。。。

补充:刚刚收到你的信息了,你把字符串压缩之后,却又用Encoding.GetString方法来得到字符串,我想错就错在这一步,你应该直接把它(也就是所得到的字节数组)以二进制的形式写进文件文件的后缀你可以自定义一个也没问题,然后读取的时候再从文件中读取出来。

简单地说就是把两个 CompressString2String,DecompressString2String两个函数修改一下:

注释:按钮一为压缩(把textBox1中的文本进行压缩然后写入date.dt文件)

按钮一为压缩(把date.dt文件的数据读出来进行解压缩并且显示在textBox2中)

static void Compress(Stream source, Stream dest)

{

using (GZipStream zipStream = new GZipStream(dest, CompressionMode.Compress, true))

{

byte[] buf = new byte[1024];

int len;

while ((len = source.Read(buf, 0, buf.Length)) > 0)

zipStream.Write(buf, 0, len);

}

}

static void Decompress(Stream source, Stream dest)

{

using (GZipStream zipStream = new GZipStream(source, CompressionMode.Decompress, true))

{

byte[] buf = new byte[1024];

int len;

while ((len = zipStream.Read(buf, 0, buf.Length)) > 0)

dest.Write(buf, 0, len);

}

}

public static bool CompressString2String(string strSource)

{

using (MemoryStream msSrc = new MemoryStream(Encoding.UTF8.GetBytes(strSource)))

using (MemoryStream msTgt = new MemoryStream())

{

Compress(msSrc, msTgt);

File.WriteAllBytes(Application.StartupPath+"data.dt",msTgt.ToArray());

}

return true;

}

public static string DecompressString2String()

{

using (MemoryStream msSrc = new MemoryStream(File.ReadAllBytes(Application.StartupPath + "data.dt")))

using (MemoryStream msTgt = new MemoryStream())

{

Decompress(msSrc, msTgt);

return Encoding.UTF8.GetString(msTgt.ToArray());

}

}

private void button1_Click(object sender, EventArgs e)

{

MessageBox.Show(CompressString2String(textBox1.Text).ToString()+"Success!");

}

private void button2_Click(object sender, EventArgs e)

{

textBox2.Text = DecompressString2String();

}

再补充:

我想问一下,你要实现的是字符串加密?还是用于网络发送?

如果你是想把一个字符串转化为另一种形式,让别人看不懂,那就用加密技术,如果,是想实现将字符发送到远程,也可以把我说的文件流改写为网络流,但是你说的字符串转换,我实在不明白?

要知道,字符串本身是由字节数组组成,当你加压之后,它本身的顺序就会被打乱,而你UTF-8的字符集是有限的(不是任意的字节组合都可以被认为是字符的),

简单地说就是像你那样做,你把加压后的字节数组(经过压缩算法转换后的二进制数据)再转化为字符串,就会造成数据丢失的情况,于是操作也就不会成功了。

到此,以上就是小编对于GZipStream的问题就介绍到这了,希望介绍关于GZipStream的2点解答对大家有用。

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。

相关文章阅读