gpt4 book ai didi

c# - 解压错误: The magic number in GZip header is not correct

转载 作者:行者123 更新时间:2023-11-30 15:56:10 28 4
gpt4 key购买 nike

我是 System.IO.Compression 的新手

我正在尝试压缩和解压缩一些信息。

对于压缩,我使用了 code project它似乎有效。我现在正在压缩字符串。

为了解压缩,我想压缩一个 Stream

这是我现在的状态

        var zipString = _compressor.Compress(request);
using (var sw = new StreamWriter(req.GetRequestStream()))
{
sw.Write(zipString);
sw.Close();
}

WebResponse respStream = req.GetResponse();
Stream resp = respStream.GetResponseStream();
resp = _compressor.UnCompress(resp);

这是压缩的代码

    public string Compress(string s)
{
//Transforming string into byte
var byteArray = new byte[s.Length];
var indexBa = 0;
foreach (var item in s.ToCharArray())
{
byteArray[indexBa++] = (byte) item;
}

//prepare for compress
var ms = new MemoryStream();
var sw = new GZipStream(ms, CompressionMode.Compress);

//compress
sw.Write(byteArray,0,byteArray.Length);

//close sw, DO NOT FLUSH because byes will go missing...
sw.Close();

//transform byte[] zip data to string
byteArray = ms.ToArray();
var sb = new StringBuilder(byteArray.Length);
foreach (var item in byteArray)
{
sb.Append((char) item);
}
ms.Close();
sw.Dispose();
ms.Dispose();
return sb.ToString();
}

下面是解压

的代码
    public Stream UnCompress(Stream s)
{
int readCount;
MemoryStream mem = new MemoryStream();
byte[] tmp = new byte[128];
while ((readCount = s.Read(tmp, 0, 128)) != 0)
{
mem.Write(tmp, 0, readCount);
}
StreamReader reader = new StreamReader(mem);
char[] buffer = new char[mem.Length];
mem.Position = 0;
reader.ReadBlock(buffer, 0, (int)mem.Length);

byte[] zip = Encoding.UTF8.GetBytes(buffer, 0, (int)mem.Length);
Stream wr = new MemoryStream();
wr.Write(zip, 0, zip.Length);
wr.Position = 0;
using (var stream = new GZipStream(wr, CompressionMode.Decompress))
{
mem = new MemoryStream();
while ((readCount = stream.Read(tmp, 0, 128)) != 0)
{
mem.Write(tmp, 0, readCount);
}
mem.Position = 0;
return mem;
}
}

此时我在以下行中解压缩时遇到错误:

while ((readCount = stream.Read(tmp, 0, 128)) != 0)
{
mem.Write(tmp, 0, readCount);
}

它只是不进入 while 循环并说:

GZip header 中的魔数(Magic Number)不正确。确保您传入的是 GZip 流

我的解压方法是基于下面的stackoverflow post

尝试 2:

        public Stream UnCompress(Stream s)
{
byte[] byteArray = null;
using (var m = new MemoryStream())
{
int count;
do
{
byte[] buf = new byte[1024];
count = s.Read(buf, 0, 1024);
m.Write(buf, 0, count);
} while (s.CanRead && count > 0);
byteArray = m.ToArray();
}
var indexBa = 0;
foreach (var item in s.ToString().ToCharArray())
{
byteArray[indexBa++] = (byte) item;
}
//Prepare for decompress
var ms = new MemoryStream(byteArray);
var sr = new GZipStream(ms,
CompressionMode.Decompress);

//Reset variable to collect uncompressed result
byteArray = new byte[byteArray.Length];

//Decompress
var rByte = sr.Read(byteArray, 0, byteArray.Length);

//Transform byte[] unzip data to string
var sB = new MemoryStream(rByte);

for (var i = 0; i < rByte; i++)
{
sB.Write(byteArray,0,rByte);
}
sr.Close();
ms.Close();
sr.Dispose();
ms.Dispose();
return sB;
}

结果:var rByte = sr.Read(byteArray, 0, byteArray.Length); 行中出现同样的错误更新 1:

如代码项目中给出的那样,解压缩字符串非常有效。

public static string UnZip(string value)
{
//Transform string into byte[]
byte[] byteArray = new byte[value.Length];
int indexBA = 0;
foreach (char item in value.ToCharArray())
{
byteArray[indexBA++] = (byte)item;
}

//Prepare for decompress
System.IO.MemoryStream ms = new System.IO.MemoryStream(byteArray);
System.IO.Compression.GZipStream sr = new System.IO.Compression.GZipStream(ms,
System.IO.Compression.CompressionMode.Decompress);

//Reset variable to collect uncompressed result
byteArray = new byte[byteArray.Length];

//Decompress
int rByte = sr.Read(byteArray, 0, byteArray.Length);

//Transform byte[] unzip data to string
System.Text.StringBuilder sB = new System.Text.StringBuilder(rByte);
//Read the number of bytes GZipStream red and do not a for each bytes in
//resultByteArray;
for (int i = 0; i < rByte; i++)
{
sB.Append((char)byteArray[i]);
}
sr.Close();
ms.Close();
sr.Dispose();
ms.Dispose();
return sB.ToString();
}

最佳答案

您的代码有很多问题,因此从头开始编写另一个版本会更容易。请注意,这样做:

var byteArray = new byte[s.Length];
var indexBa = 0;
foreach (var item in s.ToCharArray())
{
byteArray[indexBa++] = (byte) item;
}

将字符串转换为字节数组不是一个好主意。而是选择一些编码并用它进行转换。此外,将压缩结果作为字符串返回也不是一个好主意——而是返回一个字节数组,因为该字节数组并不真正代表任何字符串——它只是任意二进制数据。

示例代码:

static byte[] Compress(byte[] data) {
// `compressed` will contain result of compression
using (var compressed = new MemoryStream()) {
// source is our original uncompressed data
using (var source = new MemoryStream(data)) {
using (var gzip = new GZipStream(compressed, CompressionMode.Compress)) {
// just write whole source into gzip stream with CopyTo
source.CopyTo(gzip);
}
}
return compressed.ToArray();
}
}

static byte[] CompressString(string s, Encoding encoding) {
return Compress(encoding.GetBytes(s));
}

static string CompressStringToBase64(string s, Encoding encoding) {
return Convert.ToBase64String(CompressString(s, encoding));
}

static byte[] Decompress(Stream source) {
using (var gzip = new GZipStream(source, CompressionMode.Decompress)) {
using (var decompressed = new MemoryStream()) {
gzip.CopyTo(decompressed);
return decompressed.ToArray();
}
}
}

static byte[] Decompress(byte[] data) {
using (var ms = new MemoryStream(data)) {
return Decompress(ms);
}
}

static string DecompressString(Stream source, Encoding encoding) {
return encoding.GetString(Decompress(source));
}

测试

var source = "Some string";
var compressed = CompressString(source, Encoding.UTF8);
var decompressed = DecompressString(new MemoryStream(compressed), Encoding.UTF8);
Debug.Assert(source == decompressed);

关于c# - 解压错误: The magic number in GZip header is not correct,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47513219/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com