Почему мне нужны два вызова для потоковой передачи CopyTo?

У меня есть следующий метод, и по некоторым причинам первый вызов, который Скопирует в, кажется, ничего не делает? Кто-либо знает почему? Во входе к методу сжат, и base64 может предоставить тот метод к если потребность.

private byte[] GetFileChunk(string base64)
    {
        using (
            MemoryStream compressedData = new MemoryStream(Convert.FromBase64String(base64), false),
            uncompressedData = new MemoryStream())
        {

            using (GZipStream compressionStream = new GZipStream(compressedData, CompressionMode.Decompress))
            {
                // first copy does nothing ?? second works
                compressionStream.CopyTo(uncompressedData);
                compressionStream.CopyTo(uncompressedData);
            }

            return uncompressedData.ToArray();
        }
    }
9
задан Dan H 9 August 2010 в 01:41
поделиться

4 ответа

Если первый вызов Read () вернет 0, Stream.CopyTo () тоже не будет работать. Хотя это указывает на проблему с GZipStream, очень маловероятно, что в нем есть подобная ошибка. Гораздо более вероятно, что при создании сжатых данных что-то пошло не так. Как сначала сжатие 0 байтов, а затем сжатие реальных данных.

2
ответ дан 3 November 2019 в 07:11
поделиться

Просто предположение, но это потому, что новый конструктор GZipStream оставляет индекс в конце массива, а первый CopyTo сбрасывает его в начало, так что когда вы вызываете второй CopyTo, он теперь в начале и копирует данные правильно?

.
2
ответ дан 3 November 2019 в 07:11
поделиться

Насколько вы уверены, что первая копия ничего не делает, а вторая работает? GZipStream, это было бы ошибкой в классе GZipStream. Ваш код должен работать нормально без двойного вызова CopyTo.

1
ответ дан 3 November 2019 в 07:11
поделиться

Привет, спасибо за ваш вклад. Оказывается, ошибка была вызвана ошибкой в ​​методе кодирования. Метод был

  /// <summary>
    /// Compress file data and then base64s the compressed data for safe transportation in XML.
    /// </summary>
    /// <returns>Base64 string of file chunk</returns>
    private string GetFileChunk()
    {
        // MemoryStream for compression  output
        using (MemoryStream compressed = new MemoryStream())
        {
            using (GZipStream zip = new GZipStream(compressed, CompressionMode.Compress))
            {

                // read chunk from file
                byte[] plaintext = new byte[this.readSize];
                int read = this.file.Read(plaintext, 0, plaintext.Length);

                // write chunk to compreesion
                zip.Write(plaintext, 0, read);
                plaintext = null;

                // Base64 compressed data
                return Convert.ToBase64String(compressed.ToArray());
            }
        }
    }

. Линия возврата должна быть ниже точки использования, позволяя потоку сжатия закрывать и очищать, это вызвало несогласованное поведение при распаковке потока.

        /// <summary>
    /// Compress file data and then base64s the compressed data for safe transportation in XML.
    /// </summary>
    /// <returns>Base64 string of file chunk</returns>
    private string GetFileChunk()
    {
        // MemoryStream for compression  output
        using (MemoryStream compressed = new MemoryStream())
        {
            using (GZipStream zip = new GZipStream(compressed, CompressionMode.Compress))
            {

                // read chunk from file
                byte[] plaintext = new byte[this.readSize];
                int read = this.file.Read(plaintext, 0, plaintext.Length);

                // write chunk to compreesion
                zip.Write(plaintext, 0, read);
                plaintext = null;
            }

            // Base64 compressed data
            return Convert.ToBase64String(compressed.ToArray());
        }
    }

Спасибо за помощь.

0
ответ дан 3 November 2019 в 07:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: