Как достичь минимального размера при сжатии небольшого количества данных без потерь? - PullRequest
1 голос
/ 03 марта 2011
  1. Я не понимаю ответа на вопрос «Почему сжатие небольшого файла при помощи gzip / deflate приводит к множеству конечных нулей? » ( Почему сжатие при сжатии gzip / deflateмаленький файл приводит к множеству конечных нулей? )

  2. Как бы вы сжимали небольшое количество данных ½-2 Кбайт до минимального размера в.NET-среда?(Время выполнения для меня не проблема. Могу ли я обменять скорость на размер? Стоит ли использовать продукты сторонних производителей? Плата за лицензию для разработчика в порядке, но лицензия на время выполнения - нет.)

  3. Любые предложения о том, как я могу улучшить приведенный ниже код для:
    (a) Более высокая степень сжатия?
    (b) Более правильное использование потоков?

Вот код C #, который необходимо улучшить:

private static byte[] SerializeAndCompress(MyClass myObject)  
{
   using (var inStream = new System.IO.MemoryStream())
   {

     Serializer.Serialize< MyClass >(inStream, myObject); // PROTO-buffer  serialization. (Code not included here.)
     byte[] gZipBytearray = GZipCompress(inStream);
     return gZipBytearray;
   }
}

private static Byte[] GZipCompress(MemoryStream inStream)
{
   inStream.Position = 0;

   byte[] byteArray;
   {
      using (MemoryStream outStream = new MemoryStream())
      {
         bool LeaveOutStreamOpen = true;
         using (GZipStream compressStream = new GZipStream(outStream, 
            CompressionMode.Compress, LeaveOutStreamOpen))
         {
         // Copy the input stream into the compression stream.
         // inStream.CopyTo(Compress); TODO: "Uncomment" this line and remove the next one after upgrade to .NET 4 or later.
            CopyFromStreamToStream(inStream, compressStream);
     }
     byteArray = CreateByteArrayFromStream(outStream); // outStream is complete first after compressStream have been closed.
      }
   }
   return byteArray;
}

private static void CopyFromStreamToStream(Stream sourceStream, Stream destinationStream)
{
   byte[] buffer = new byte[4096];
   int numRead;
   while ((numRead = sourceStream.Read(buffer, 0, buffer.Length)) != 0)
   {
     destinationStream.Write(buffer, 0, numRead);
   }
}

private static byte[] CreateByteArrayFromStream(MemoryStream outStream)
{
   byte[] byteArray = new byte[outStream.Length];
   outStream.Position = 0;
   outStream.Read(byteArray, 0, (int)outStream.Length);
   return byteArray;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...