5

我知道有system.io.compression.gzipstream,但它接受流作为参数。

我正在寻找一个接受字符串的方法

如。

字符串压缩(字符串压缩,压缩级别);字符串解压缩(string stringcodecompress);
1

2个答案2

重置为默认值
26

你应该试试这个:

使用系统;使用系统。信息作战;使用系统。IO.压缩;使用系统。文本;...公共静态字符串压缩(字符串){var bytes=编码。Unicode码。GetBytes(s)(获取字节数);using(var msi=新内存流(字节))using(var mso=new MemoryStream()){using(var gs=新GZipStream(mso,CompressionMode.Compress)){msi。抄送(gs);}return转换。ToBase64String(mso.ToArray());}}公共静态字符串解压缩(字符串){var字节=转换。来自Base64字符串;using(var msi=新内存流(字节))using(var mso=new MemoryStream()){using(var gs=新GZipStream(msi,CompressionMode.Decompress)){gs.复制到(mso);}return编码。Unicode码。获取字符串(mso.ToArray());}}
2
  • 4
    请记住,base64算法将编码数据的大小增加了35%。因此,它可能会从使用过的压缩中“吃”到好处。最好在协议级别(例如http)上设置压缩,或者使用字节数组而不是字符串。 评论 2018年3月22日13:43
  • 更改为UTF8对我很有用。如果我使用Unicode,标准的通用解压缩工具会给我“H.e.l.o.”而不是“Hello” 评论 2019年9月25日10:09
5

请根据此url尝试以下操作:http://dreamstatecoding.blogspot.com/2013/04/c-array-compress-and-decompress-with.html.我们避免使用双MemoryStream。

公共静态字节[]压缩(字符串文本){var bytes=编码。Unicode码。GetBytes(文本);使用(var mso=new MemoryStream()){using(var gs=新GZipStream(mso,CompressionMode.Compress)){gs.Write(字节,0,字节.Length);}返回mso。ToArray();}}公共静态字符串解压缩(字节[]数据){//读取最后4个字节以获取长度byte[]lengthBuffer=新字节[4];阵列。复制(data,data.Length-4,lengthBuffer,0,4);int uncompressedSize=BitConverter。ToInt32(lengthBuffer,0);var buffer=新字节[uncompressedSize];使用(var-ms=新内存流(数据)){using(var gzip=新GZipStream(ms,CompressionMode.Decompress)){gzip。读取(buffer,0,uncompressedSize);}}return编码。Unicode码。GetString(缓冲区);}
2
  • 请注意gzip。读取(buffer,0,uncompressedSize)可能无法实际读取整个流。您可能需要在一个循环中重复调用,查看返回值,以跟踪实际读取到缓冲区中的字节数。请参阅github.com/dotnet/runtime/issues/62954了解更多信息。 评论 2023年6月25日4:18
  • 此外解压缩大小可以更简洁地计算比特转换器。ToInt32(数据,数据。长度-4) 评论 2023年6月25日4:22

你的答案

单击“发布您的答案”,表示您同意我们的服务条款并确认您已阅读我们的隐私政策.

不是你想要的答案吗?浏览标记的其他问题问你自己的问题.