класс Gzipstream и Deflatestream

  • Автор темы bbb3
  • Дата начала
B

bbb3

#1
привет всем,
смотрю пример [a ms-href=help://MS.VSCC.v80/MS.MSDN.v80/MS.NETDEVFX.v20.en/cpref8/html/T_System_IO_Compression_CompressionMode.htm][/a]

при попытке распаковать и классом GZipStream и классом DeflateStream
первое чтение возвращает нуль, если повторно читать возвращает не нуль

а попытка выполнить Seek выдает exception: This operation is not supported.

вот мой код
Код:
		private byte[] unzipGZip(byte[] Data)
{
byte[] unzipData = null;
if ((Data != null) || (Data.Length != 0))
{
int L = 512;
unzipData = new byte[L];
MemoryStream ms = new MemoryStream();
ms.Write(Data, 0, Data.Length);
ms.Position = 0;
//DeflateStream unzipStream = new DeflateStream(ms, CompressionMode.Decompress);
GZipStream unzipStream = new GZipStream(ms, CompressionMode.Decompress);
try
{
byte[] t;
int offset = 0;
int bytesRead = 0;


// !!! $exception	{"This operation is not supported."}
// unzipStream.Seek(0, SeekOrigin.Begin); 

// !!! возвращает 0 и отрабатывает как
// !!! unzipStream.Seek(0, SeekOrigin.Begin)
bytesRead = unzipStream.Read(unzipData, offset, L); //***
while (true)
{
if (bytesRead == 0) // пропустим чтение, если строка *** прочитал
bytesRead = unzipStream.Read(unzipData, offset, L);
if (bytesRead == 0)
break;

t = new byte[unzipData.Length - L + bytesRead + L];
Array.Copy((Array)unzipData, 0, (Array)t, 0, unzipData.Length - L + bytesRead);
unzipData = t;
t = null;

offset += bytesRead;
bytesRead = 0;
}
t = new byte[unzipData.Length - L];
Array.Copy((Array)unzipData, 0, (Array)t, 0, t.Length);
unzipData = t;

unzipStream.Close();
ms.Close();
}
catch (Exception e)
{
sErr = e.Message;
unzipData = null;
}
}
return unzipData;
}
 
P

Pasha

#2
Для: bbb3
Твой код работает и все вполне нормально распаковывает. Тебе нужно чтобы он делал то же самое, но с Seek?
 
B

bbb3

#3
работает то работает, но логика "неправильная":
строка bytesRead = unzipStream.Read(unzipData, offset, L); //***
не должна присутствовать, и вот сейчас только столкнулся, послдение байты(заметил на 0xD, 0xA)
не распаковывает
 
P

Pasha

#4
Для: bbb3
Логика правильная, просто немного неуклюжая. Жмем данные сэмплом из msdn, распаковываем твоим и моим вариантом. Сравниваем с оригиналом. Вот, смотри:
Код:
using System;
using System.IO;
using System.IO.Compression;

namespace CompressionTest
{
class Program
{
private static byte[] unzipGZip(byte[] data)
{
byte[] result = new byte[0];
if ((data != null) && (data.Length != 0))
{
MemoryStream ms = new MemoryStream();
ms.Write(data, 0, data.Length);
ms.Position = 0;

using (GZipStream unzipStream = new GZipStream(ms, CompressionMode.Decompress))
{
byte[] unzipBuffer = new byte[512];

while (true)
{
int bytesRead = unzipStream.Read(unzipBuffer, 0, unzipBuffer.Length);
if (bytesRead == 0)
break;

Array.Resize(ref result, result.Length + bytesRead);
Array.Copy(unzipBuffer, 0, result, result.Length - bytesRead, bytesRead);
}
}
}
return result;
}

private static byte[] unzipGZip1(byte[] Data)
{
byte[] unzipData = null;
if ((Data != null) || (Data.Length != 0))
{
int L = 512;
unzipData = new byte[L];
MemoryStream ms = new MemoryStream();
ms.Write(Data, 0, Data.Length);
ms.Position = 0;
//DeflateStream unzipStream = new DeflateStream(ms, CompressionMode.Decompress);
GZipStream unzipStream = new GZipStream(ms, CompressionMode.Decompress);
try
{
byte[] t;
int offset = 0;
int bytesRead = 0;


// !!! $exception	{"This operation is not supported."}
// unzipStream.Seek(0, SeekOrigin.Begin);

// !!! возвращает 0 и отрабатывает как
// !!! unzipStream.Seek(0, SeekOrigin.Begin)
bytesRead = unzipStream.Read(unzipData, offset, L); //***
while (true)
{
if (bytesRead == 0) // пропустим чтение, если строка *** прочитал
bytesRead = unzipStream.Read(unzipData, offset, L);
if (bytesRead == 0)
break;

t = new byte[unzipData.Length - L + bytesRead + L];
Array.Copy((Array)unzipData, 0, (Array)t, 0, unzipData.Length - L + bytesRead);
unzipData = t;
t = null;

offset += bytesRead;
bytesRead = 0;
}
t = new byte[unzipData.Length - L];
Array.Copy((Array)unzipData, 0, (Array)t, 0, t.Length);
unzipData = t;

unzipStream.Close();
ms.Close();
}
catch (Exception e)
{
unzipData = null;
}
}
return unzipData;
}

public static bool CompareData(byte[] buf1, int len1, byte[] buf2, int len2)
{
// Use this method to compare data from two different buffers.
if (len1 != len2)
{
Console.WriteLine("Number of bytes in two buffer are different {0}:{1}", len1, len2);
return false;
}

for (int i = 0; i < len1; i++)
{
if (buf1[i] != buf2[i])
{
Console.WriteLine("byte {0} is different {1}|{2}", i, buf1[i], buf2[i]);
return false;
}
}
Console.WriteLine("All bytes compare.");
return true;
}

static void Main(string[] args)
{
FileStream infile = new FileStream(@"D:\1.txt", FileMode.Open, FileAccess.Read, FileShare.Read);
byte[] buffer = new byte[infile.Length];
// Read the file to ensure it is readable.
int count = infile.Read(buffer, 0, buffer.Length);
if (count != buffer.Length)
{
infile.Close();
Console.WriteLine("Test Failed: Unable to read data from file");
return;
}
infile.Close();
MemoryStream ms = new MemoryStream();
// Use the newly created memory stream for the compressed data.
GZipStream compressedzipStream = new GZipStream(ms, CompressionMode.Compress, true);
Console.WriteLine("Compression");
compressedzipStream.Write(buffer, 0, buffer.Length);
// Close the stream.
compressedzipStream.Close();
Console.WriteLine("Original size: {0}, Compressed size: {1}", buffer.Length, ms.Length);

byte[] compressedBuffer = new byte[ms.Length];

ms.Position = 0;
ms.Read(compressedBuffer, 0, compressedBuffer.Length);

byte[] unzipedData = unzipGZip(compressedBuffer);
CompareData(buffer, buffer.Length, unzipedData, unzipedData.Length);

byte[] unzipedData1 = unzipGZip1(compressedBuffer);
CompareData(buffer, buffer.Length, unzipedData1, unzipedData1.Length);
}
}
}
Насчет 0xD, 0xA - не совсем понимаю что ты имел в виду.