Обрезание 1 или более байтов с помощью GZip туда и обратно - PullRequest
3 голосов
/ 13 мая 2009

Я не понимаю. Я использовал подобный / такой же подход уже много лет и никогда не испытывал этого.

По какой-то причине, которую я не принимал до сегодняшнего дня, двусторонняя передача GZip приводит к обрезанию 1 или более байтов или искажению данных.

Я написал простой тест, чтобы убедиться, что что-то еще не влияет на него.

Это всегда приводит к «несоответствию длины».

Может ли кто-нибудь подтвердить мне, что я не сумасшедший? :)

Спасибо

leppie

TEST

using System;
using System.Diagnostics;
using System.IO;
using System.IO.Compression;

class Program
{
  const int BUFFER_SIZE = 8192;

  static void Main(string[] args)
  {
    var filename = args[0];
    var filedata = File.ReadAllBytes(filename);
    var cmp = Compress(filedata);
    var dec = Decompress(cmp);

    Assert(filedata, dec);

    Console.ReadLine();
  }

  static void Assert(byte[] orig, byte[] data)
  {
    if (orig.Length != data.Length)
    {
      Debug.Fail("length mismatch");
    }
    for (int i = 0; i < orig.Length; i++)
    {
      Debug.Assert(orig[i] == data[i], "data mismatch");
    }
  }

  static byte[] Compress(byte[] data)
  {
    var input = new MemoryStream(data);
    var output = new MemoryStream();

    var s = new GZipStream(output, CompressionMode.Compress);
    byte[] buffer = new byte[BUFFER_SIZE];
    int read = 0;
    while ((read = input.Read(buffer, 0, buffer.Length)) > 0)
    {
      s.Write(buffer, 0, read);
    }

    return output.ToArray();
  }

  static byte[] Decompress(byte[] data)
  {
    var input = new MemoryStream(data);
    var s = new GZipStream(input, CompressionMode.Decompress);

    var output = new MemoryStream();
    byte[] buffer = new byte[BUFFER_SIZE];
    int read = 0;
    while ((read = s.Read(buffer, 0, buffer.Length)) > 0)
    {
      output.Write(buffer, 0, read);
    }

    return output.ToArray();
  }
}

Я тоже пробовал правильно закрывать потоки, с разными размерами буфера, все тот же результат.

1 Ответ

3 голосов
/ 13 мая 2009

ОК, обнаружена проблема.

Вам необходимо закрыть поток сжатия перед извлечением байтов.

Например:

s.Close();
return output.ToArray();
...