我们如何创建一个简单的函数来从字节数组中获取压缩内容(使用Deflate方法压缩,ANSI编码)并用字符串表示?
我选择这个:
public string UnzipString3(byte[] byteArrayCompressedContent)
{
int compressedSize = byteArrayCompressedContent.Length;
try
{
using (MemoryStream inputMemoryStream = new MemoryStream(byteArrayCompressedContent))
{
//I need to consume the first 2 bytes to be able read the stream
//If I consume 0 or 4, I can't exploit it
inputMemoryStream.Seek(2, SeekOrigin.Begin);
using (DeflateStream deflateStream = new DeflateStream(inputMemoryStream, System.IO.Compression.CompressionMode.Decompress))
{
//deflateStream.BaseStream.Position = 0;
using (StreamReader reader = new StreamReader(deflateStream, System.Text.Encoding.UTF8))
{
string uncompressedContent = reader.ReadToEnd();
reader.Close();
return uncompressedContent;
}
}
}
}
catch (Exception e)
{
return "";
}
}
如果需要,我可以看到读取inputMemoryStream的压缩数据,但是 StreamReader.ReadToEnd()给出的uncompressedContent总是返回一个空字符串。根据MSDN(https://msdn.microsoft.com/en-us/library/system.io.streamreader.readtoend(v=vs.110).aspx),它应该在读取时发生,并且位置已经在" Stream" (我对哪个流感到困惑),但StreamReader没有位置,我无法改变DeflateStream的位置,因为它没有位置和长度等流
将compressStream位置设置为0之前复制导致块长度与其补码不匹配"错误无论如何。
编辑:
当我使用RaTruong的解决方案时:
public static string UnzipString3(byte[] byteArrayCompressedContent)
{
using (var outputStream = new MemoryStream())
{
using (var compressStream = new MemoryStream(byteArrayCompressedContent))
{
using (var deflateStream = new DeflateStream(compressStream, CompressionMode.Decompress))
{
deflateStream.CopyTo(outputStream);
}
}
return Encoding.UTF8.GetString(outputStream.ToArray());
}
}
这导致了我一直有的困境:要么我喜欢这样,DeflateStream.CopyTo函数返回"块长度与其补码不匹配"错误;或者我消耗了两个第一个字节,它实际上没有带来任何错误,但仍然没有复制,然后返回一个空字符串 ......
如果我尝试解压缩File的FileStream而不是其字节数组,则会发生相同的情况。 我使用MSDN(https://msdn.microsoft.com/en-us/library/system.io.compression.deflatestream(v=vs.110).aspx)中给出的解压缩功能:
public string ExtractContent()
{
try
{
FileInfo fileInfo = new FileInfo("22CC0001.23U");
// Get the stream of the source file.
using (FileStream inFile = fileInfo.OpenRead())
{
// Get original file extension, for example
// "doc" from report.doc.gz.
string curFile = fileInfo.FullName;
string origName = curFile.Remove(curFile.Length -
fileInfo.Extension.Length);
//Create the decompressed file.
using (FileStream outFile = File.Create(origName))
{
using (DeflateStream decompressDeflateStream = new DeflateStream(inFile,
CompressionMode.Decompress))
{
// Copy the decompression stream
// into the output file.
decompressDeflateStream.CopyTo(outFile);
Console.WriteLine("Decompressed: {0}", fileInfo.Name);
}
}
}
}
catch (Exception e)
{
return "errorelole";
}
return "";
}
相同"块长度与其补码不匹配"错误...
有一件事是我的文件扩展名不是" .zip"添加在文件的末尾,但另一个扩展名(在这种情况下为.23U)。 当我创建一个具有相同扩展名的新文件(在这种情况下为.23U而不是没有扩展名)时,会出现同样的问题。
答案 0 :(得分:0)
你的解压缩方法应该如下所示。在您可以读取流之前,不确定在哪里消费前2个字节。
public static string UnzipString3(byte[] byteArrayCompressedContent)
{
using (var outputStream = new MemoryStream())
{
using (var compressStream = new MemoryStream(byteArrayCompressedContent))
{
using (var deflateStream = new DeflateStream(compressStream, CompressionMode.Decompress))
{
deflateStream.CopyTo(outputStream);
}
}
return Encoding.UTF8.GetString(outputStream.ToArray());
}
}