Сжатие GZIPStream всегда возвращает 10 байт

Я пытаюсь сжать некоторый текст в своем приложении UWP. Я создал этот метод, чтобы упростить его позже:

public static byte[] Compress(this string s)
{
    var b = Encoding.UTF8.GetBytes(s);
    using (MemoryStream ms = new MemoryStream())
    using (GZipStream zipStream = new GZipStream(ms, CompressionMode.Compress))
    {
        zipStream.Write(b, 0, b.Length);
        zipStream.Flush(); //Doesn't seem like Close() is available in UWP, so I changed it to Flush(). Is this the problem?
        return ms.ToArray();
    }
}

Но, к сожалению, это всегда возвращает 10 байтов, независимо от входного текста. Это потому, что я не использую .Close() на GZipStream?


person Reynevan    schedule 20.10.2016    source источник


Ответы (1)


Вы возвращаете байтовые данные слишком рано. Метод Close() заменен методом Dispose(). Таким образом, поток GZIP будет записан только после удаления, поэтому после вы покинете блок using(GZipStream) {}.

public static byte[] Compress(string s)
{
    var b = Encoding.UTF8.GetBytes(s);
    var ms = new MemoryStream();
    using (GZipStream zipStream = new GZipStream(ms, CompressionMode.Compress))
    {
        zipStream.Write(b, 0, b.Length);
        zipStream.Flush(); //Doesn't seem like Close() is available in UWP, so I changed it to Flush(). Is this the problem?
    }

    // we create the data array here once the GZIP stream has been disposed
    var data    = ms.ToArray();
    ms.Dispose();
    return data;
}
person Vincent    schedule 20.10.2016
comment
Да, это работает как шарм! Я пытался использовать .Dispose() раньше, но вместо того, чтобы использовать его вне блока using(), я просто вызвал его перед возвратом данных, и это привело к удалению ms. Спасибо! - person Reynevan; 20.10.2016