.NET i takie tam

Kompresja danych w .NET Compact Framework

with 2 comments

Pełna wersja platformy .NET’a udostępnia nam przestrzeń nazw System.IO.Compression. Tam możemy znaleźć klasy GZipStream i DeflateStream które umożliwiają nam kompresje naszych danych. Niestety .NET Compact Framework 2.0 – nie zawiera tej przestrzeni nazw. Jest ona dostępna w najnowszej wersji .NET Compact Framework 3.5 która można pobrać razem z beta Visual Studio ‚Orcas’ – ale póki co musimy szukać rozwiązania problemu gdzie indziej.

Problem z pierwszym rozwiązaniem jest oczywisty😉 wiec przejdę od razu do punktu drugiego. #ZipLib – została zaprojektowana pod katem pełnej wersji .NET Frameworka jednakże sprawuje sie całkiem dobrze na wersji Compact. Jednak moim zdaniem ma za duży footprint jak dla zastosowania na urządzeniach przenośnych, dodatkowo #ZipLib ładuje nie jedno a aż pięć assembly:

  • ICSharpCode.SharpZipLib.dll
  • system.dll
  • system.xml.dll
  • system.security.dll
  • system.data.sqlxml.dll
  • system.configuration.dll

co ogranicza jej zastosowanie w aplikacjach mobilnych. Rozwiązanie trzecie – implementacja GZipStream i DeflateStream przeznaczona na .NET Compact.

Wystarczy dodać System.IO.Compression do referencji naszej aplikacji i użyć metod:

/// <summary>
/// Compress the raw data using gzip compression
/// </summary>
/// <param name="rawData"></param>
/// <returns></returns>
public static byte[] Compress(byte[] data)
{
  byte[] b = null;

  using(MemoryStream ms = new MemoryStream())
  {
    using(GZipStream gzs = new GZipStream(ms, CompressionMode.Compress))
    {
      gzs.Write(data, 0, data.Length);
      gzs.Close();
    }

    b = ms.ToArray();
    ms.Close();
  }

  return b;
}

/// <summary>
/// Decompress the data using gzip compression
/// </summary>
/// <param name="data"></param>
/// <returns></returns>
public static byte[] Decompress(byte[] data)
{
  byte[] b = new byte[2048];

  using(MemoryStream ms = new MemoryStream())
  {
    using(GZipStream gzs = new GZipStream(new MemoryStream(data), CompressionMode.Decompress))
    {
      while(true)
      {
        int s = gzs.Read(b, 0, b.Length);
        if(s > 0)
          ms.Write(b, 0, s);
        else
        {
          if(ms.Length == 0)
            throw new Exception("Cannot read from GZipStream.");
          else
            break;
        }
      }

      gzs.Close();
    }

    b = ms.ToArray();
    ms.Close();
  }

  return b;
}

Written by sakowicz

Kwiecień 23, 2007 @ 5:56 pm

Napisane w .NET CF

Odpowiedzi: 2

Subscribe to comments with RSS.

  1. […] ZIP & DeflateStream Jakiś czas temu pisałem o kompresji danych w .NET Compact Framework’u, tutaj natknąłem się na post Jon’a […]

  2. no man, zes mi zycie ulatwil, aczkolwiek nie wiem dla kogo sa te dwie metodki :p

    miechu

    Marzec 8, 2008 at 11:54 pm


Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Log Out / Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Log Out / Zmień )

Facebook photo

Komentujesz korzystając z konta Facebook. Log Out / Zmień )

Google+ photo

Komentujesz korzystając z konta Google+. Log Out / Zmień )

Connecting to %s

%d bloggers like this: