Ошибка: магическое число в заголовке GZip неверно - PullRequest
4 голосов
/ 08 апреля 2010

У меня есть два метода, один из которых я использую для преобразования изображения в строку Base64, чтобы я мог сохранить его в теге XML, а другой - для преобразования строки Base64 обратно в изображение. Я могу преобразовать изображение в строку и сохранить его в XML, но когда я пытаюсь преобразовать строку обратно в изображение, я получаю следующую ошибку: «Магическое число в заголовке GZip неверно. уверен, что вы передаете поток GZip. "

Есть мысли о том, как решить эту проблему?

public static string ConvertToBase64String(Image Image, ImageFormat Format)
{
    MemoryStream stream = new MemoryStream();
    Image.Save(stream, Format);

    byte[] imageBytes = stream.ToArray();

    MemoryStream memStream = new MemoryStream();
    GZipStream zipStream = new GZipStream(memStream, CompressionMode.Compress);
    zipStream.Write(imageBytes, 0, imageBytes.Length);

    string imageString = Convert.ToBase64String(imageBytes);

    stream.Close();
    memStream.Close();

    return imageString;
}

public static Image Base64StringToImage(string ImageArray)
{
    byte[] base64String = Convert.FromBase64String(ImageArray);

    MemoryStream memStream = new MemoryStream(base64String);
    GZipStream zipStream = new GZipStream(memStream, CompressionMode.Decompress);
    zipStream.Read(base64String, 0, base64String.Length);

    ImageConverter ic = new ImageConverter();
    Image image = (Image)ic.ConvertFrom(base64String);

    memStream.Close();

    return image;
}

1 Ответ

6 голосов
/ 08 апреля 2010

Я вижу несколько ошибок в коде.

Проблема, которая вызывает сообщение об ошибке, состоит в том, что то, что вы не конвертируете в строку base 64, это не сжатые данные (memStream.ToArray()), а данные, которые вы записали в поток zip (imageBytes). При попытке разархивировать данные, которые не были заархивированы, вы получаете сообщение об ошибке.

Другая серьезная проблема заключается в том, что вы читаете только часть данных из потока zip, поскольку вы используете размер сжатых данных в качестве размера для чтения из потока zip.

Кроме того, вы игнорируете результат метода Read. Он возвращает количество байтов, которое было фактически помещено в массив, которое может быть меньше, чем количество запрошенных байтов. Поскольку метод Read не должен возвращать все доступные данные, вы должны выполнять цикл до тех пор, пока не получите все данные из потока. Метод Read вернет ноль, если больше нет данных для чтения.

Другая проблема заключается в том, что вы пишете в массив, который используете в качестве внутреннего конца для потока памяти, из которого вы читаете. Поскольку распакованные данные обычно больше, чем сжатые, вы будете перезаписывать данные быстрее, чем сможете их прочитать. Однако, поскольку распакованные данные не помещаются в массив, вы все равно не сможете их использовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...