1. Акция на весь декабрь! Получай оплату х2 за уникальные статьи, объемом от 200 слов, если в заголовке темы и теле статьи присутствует слово Python
    Скрыть объявление

класс Gzipstream и Deflatestream

Тема в разделе "Свободное общение", создана пользователем bbb3, 12 ноя 2007.

  1. bbb3

    bbb3 Гость

    привет всем,
    смотрю пример [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.

    вот мой код
    Код (Text):
            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;
    }
     
  2. Pasha

    Pasha Гость

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

    bbb3 Гость

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

    Pasha Гость

    Для: bbb3
    Логика правильная, просто немного неуклюжая. Жмем данные сэмплом из msdn, распаковываем твоим и моим вариантом. Сравниваем с оригиналом. Вот, смотри:
    Код (Text):
    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 - не совсем понимаю что ты имел в виду.
     
Загрузка...

Поделиться этой страницей