2010-08-09 26 views
9

Tôi có phương pháp sau đây và vì lý do nào đó, cuộc gọi đầu tiên để Sao chép dường như không làm gì cả? Có ai biết tại sao không? Trong đầu vào cho phương thức được nén và base64 có thể cung cấp phương thức đó nếu cần.Tại sao tôi cần hai cuộc gọi để phát trực tiếp CopyTo?

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(); 
     } 
    } 

Trả lời

2

Nếu cuộc gọi đầu tiên tới Read() trả về 0 thì Stream.CopyTo() cũng sẽ không hoạt động. Mặc dù điều này dẫn đến sự cố với GZipStream, nhưng đó là rất có khả năng không có lỗi như thế này. Rất có thể là đã xảy ra sự cố khi bạn tạo dữ liệu đã nén. Giống như nén 0 byte trước, tiếp theo là nén dữ liệu thực.

2

Chỉ cần một đoán, nhưng là nó vì GZipStream constructor mới rời khỏi chỉ số vào cuối mảng, và CopyTo reset đầu tiên nó khi bắt đầu, do đó khi bạn gọi thứ hai CopyTo của nó tại bắt đầu và sao chép dữ liệu đúng cách?

1

Bạn chắc chắn rằng bản sao đầu tiên không làm gì cả và bản sao thứ hai hoạt động , đó có thể là lỗi trong lớp GZipStream. Mã của bạn sẽ hoạt động tốt mà không cần gọi đến CopyTo hai lần.

+0

Bản sao đầu tiên không điền luồng; có được hành vi tương tự với phương pháp đọc. Các GZipStream là một lớp Microsoft surly không có một lỗi trong lớp học? –

+0

Hmm là bạn chắc chắn 100%. Đọc là một vấn đề khác hoàn toàn hợp đồng trên phương pháp đọc nói rằng nó không đảm bảo trả về số byte yêu cầu nhưng tài liệu CopyTo không đưa ra yêu cầu tương tự, nhưng có lẽ nó sử dụng phương thức Read trong nội bộ. Bạn đã thử sử dụng nó trong một vòng lặp cũ cho mỗi ví dụ trên trang Stream.Read MSDN http://msdn.microsoft.com/en-us/library/system.io.stream.read.aspx –

+0

Ya bắt đầu với một vòng lặp , cuộc gọi đầu tiên để đọc trả về 0, các cuộc gọi tiếp theo để đọc byte trả về cho đến khi kết thúc. –

0

Xin cảm ơn bạn đã nhập ý kiến ​​của mọi người. Nó chỉ ra lỗi được gây ra bởi một sai lầm trong phương pháp mã hóa. Phương pháp là

/// <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()); 
      } 
     } 
    } 

Đường trả về phải dưới mức sử dụng cho phép luồng nén đóng và xả, điều này gây ra hành vi không nhất quán khi giải nén luồng.

 /// <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()); 
     } 
    } 

Cảm ơn sự giúp đỡ của mọi người.

Các vấn đề liên quan