无法在 C# 中解压缩 - 此消息使用什么压缩方法?
Unable to decompress in C# - what compression method is this message using?
我有一个base64字符串qsZhqyXY0rTEnOLUWgAAAAD//w==
。
这表示使用(我相信)zlib 压缩的 JSON 格式的 UTF8 字符串。我不知道 JSON.
的确切内容
我首先将这个字符串转换为字节:
var bytes = Convert.FromBase64String(base64string);
foreach (var b in bytes) Console.Write($"{b:x2} ");
// aa c6 61 ab 25 d8 d2 b4 c4 9c e2 d4 5a 00 00 00 00 ff ff
最后是标准的 00 00 ff ff
,但是 none 的 zlib 魔法 headers 我知道:
78 01
低压缩
78 9c
默认压缩
78 da
最佳压缩
通常,我的理解是,在使用 DeflateStream
时,您应该删除指定压缩类型的前两个字节。这是我解压这个字节数组的方法,它删除了 header,但是即使不删除 header 它也会失败。
public static byte[] InflateByteArray(byte[] bytes)
{
var outputStream = new MemoryStream();
MemoryStream inputStream = new MemoryStream(bytes, 2, bytes.Length - 2);
using var deflateStream = new DeflateStream(inputStream, CompressionMode.Decompress);
deflateStream.CopyTo(outputStream); // exception here
return outputStream.ToArray();
}
当我在上面的字节数组上 运行 这个方法时,我得到一个 System.IO.InvalidDataException
和消息 'The archive entry was compressed using an unsupported compression method.'。
为什么会这样?此邮件使用什么压缩方法?
尝试以下操作:
string input = "aa c6 61 ab 25 d8 d2 b4 c4 9c e2 d4 5a 00 00 00 00 ff ff";
byte[] bytes = input.Split(new char[] { ' ' }).Select(x => byte.Parse(x, System.Globalization.NumberStyles.HexNumber)).ToArray();
MemoryStream ms = new MemoryStream(bytes);
ms.Position = 0;
System.IO.Compression.DeflateStream gzip = new System.IO.Compression.DeflateStream(ms, System.IO.Compression.CompressionMode.Decompress);
List<byte> uncompressed = new List<byte>();
int bytesRead = 0;
do
{
byte[] chunk = new byte[1000];
bytesRead = gzip.Read(chunk, 0, 1000);
uncompressed.AddRange(chunk.ToList().GetRange(0,bytesRead));
} while (bytesRead == 1000);
这是来自 deflate 流中间 的一小段 deflate 数据。如果没有至少在它之前的放气流,它对你没有好处。它的放气“反汇编”给出:
fixed
literal '{
match 23 118
literal '9
match 5 117
literal 'false}
end
stored
end
match 23 118
表示要从 way 复制字节,在此小 deflate 片段中提供的数据之前。 (之前的 117 个字节。)第二个相同 match
。解压后的数据是一个{
,你不知道的过去的23个字节,一个9
,还有五个你不知道的字节,false}
.
None 个 deflate 块被标记为最后一个块,因此此代码段后有更多 deflate 数据。
末尾的空存储块,您称之为 “末尾的标准 00 00 ff ff
” 实际上不是标准的。这就是当压缩流由于某种原因被分解成小块进行传输时插入的内容,以便将每个块带到字节边界。通常 deflate 块可以从任何位位置开始。您不会在正常压缩的 deflate 流中找到它们。
我有一个base64字符串qsZhqyXY0rTEnOLUWgAAAAD//w==
。
这表示使用(我相信)zlib 压缩的 JSON 格式的 UTF8 字符串。我不知道 JSON.
我首先将这个字符串转换为字节:
var bytes = Convert.FromBase64String(base64string);
foreach (var b in bytes) Console.Write($"{b:x2} ");
// aa c6 61 ab 25 d8 d2 b4 c4 9c e2 d4 5a 00 00 00 00 ff ff
最后是标准的 00 00 ff ff
,但是 none 的 zlib 魔法 headers 我知道:
78 01
低压缩78 9c
默认压缩78 da
最佳压缩
通常,我的理解是,在使用 DeflateStream
时,您应该删除指定压缩类型的前两个字节。这是我解压这个字节数组的方法,它删除了 header,但是即使不删除 header 它也会失败。
public static byte[] InflateByteArray(byte[] bytes)
{
var outputStream = new MemoryStream();
MemoryStream inputStream = new MemoryStream(bytes, 2, bytes.Length - 2);
using var deflateStream = new DeflateStream(inputStream, CompressionMode.Decompress);
deflateStream.CopyTo(outputStream); // exception here
return outputStream.ToArray();
}
当我在上面的字节数组上 运行 这个方法时,我得到一个 System.IO.InvalidDataException
和消息 'The archive entry was compressed using an unsupported compression method.'。
为什么会这样?此邮件使用什么压缩方法?
尝试以下操作:
string input = "aa c6 61 ab 25 d8 d2 b4 c4 9c e2 d4 5a 00 00 00 00 ff ff";
byte[] bytes = input.Split(new char[] { ' ' }).Select(x => byte.Parse(x, System.Globalization.NumberStyles.HexNumber)).ToArray();
MemoryStream ms = new MemoryStream(bytes);
ms.Position = 0;
System.IO.Compression.DeflateStream gzip = new System.IO.Compression.DeflateStream(ms, System.IO.Compression.CompressionMode.Decompress);
List<byte> uncompressed = new List<byte>();
int bytesRead = 0;
do
{
byte[] chunk = new byte[1000];
bytesRead = gzip.Read(chunk, 0, 1000);
uncompressed.AddRange(chunk.ToList().GetRange(0,bytesRead));
} while (bytesRead == 1000);
这是来自 deflate 流中间 的一小段 deflate 数据。如果没有至少在它之前的放气流,它对你没有好处。它的放气“反汇编”给出:
fixed
literal '{
match 23 118
literal '9
match 5 117
literal 'false}
end
stored
end
match 23 118
表示要从 way 复制字节,在此小 deflate 片段中提供的数据之前。 (之前的 117 个字节。)第二个相同 match
。解压后的数据是一个{
,你不知道的过去的23个字节,一个9
,还有五个你不知道的字节,false}
.
None 个 deflate 块被标记为最后一个块,因此此代码段后有更多 deflate 数据。
末尾的空存储块,您称之为 “末尾的标准 00 00 ff ff
” 实际上不是标准的。这就是当压缩流由于某种原因被分解成小块进行传输时插入的内容,以便将每个块带到字节边界。通常 deflate 块可以从任何位位置开始。您不会在正常压缩的 deflate 流中找到它们。