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

环境.NET3.5,在做字符串压缩和解压缩的时候,会出现这样的一个问题:压缩了之后的字符串不能用相同的GZIP解压缩回去,并且会报异常ThemagicnumberinGZ... 环境 .NET 3.5,在做字符串压缩和解压缩的时候,会出现这样的一个问题:压缩了之后的字符串不能用相同的GZIP解压缩回去,并且会报异常The magic number in GZip header is not correct. Make sure you are passing in a GZip stream. 但是如果采用Encoding.Default就可以执行解压缩,但是实际上也只是在解压缩的时候不出异常而已,default实际上是ANSI,这个字符集对中文根本就不支持。

不知道其他师兄在做这个类似的情况的时候是如何处理的,请指一条明路。谢谢
展开
 我来答
石高飞1
2010-12-31 · TA获得超过560个赞
知道小有建树答主
回答量:301
采纳率:0%
帮助的人:244万
展开全部
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的字符集是有限的(不是任意的字节组合都可以被认为是字符的),
简单地说就是像你那样做,你把加压后的字节数组(经过压缩算法转换后的二进制数据)再转化为字符串,就会造成数据丢失的情况,于是操作也就不会成功了。

参考资料: 原创

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式