2010-11-11 21 views
8

İşte garip olanı.DeflateStream veri sıkıştırmayı değil (ilk kez)

public static string Base64Decompress(string base64data) 
{ 
    byte[] b = Convert.FromBase64String(base64data); 
    using (var orig = new MemoryStream(b)) 
    { 
     using (var inflate = new MemoryStream()) 
     { 
      using (var ds = new DeflateStream(orig, CompressionMode.Decompress)) 
      { 
       ds.CopyTo(inflate); 
       return Encoding.ASCII.GetString(inflate.ToArray()); 
      } 
     } 
    } 
} 

Bu benim ds.CopyTo(inflate) için ikinci bir arama eklemek sürece boş bir dize döndürür: Ben orijinal verileri Base64 ile kodlanmış sönmüş dize almak ve geri dönmek için bu yöntemi var. (WTF?)

... 
      using (var ds = new DeflateStream(orig, CompressionMode.Decompress)) 
      { 
       ds.CopyTo(inflate); 
       ds.CopyTo(inflate); 
       return Encoding.ASCII.GetString(inflate.ToArray()); 
      } 
    ... 

(ds üzerine Flush/Close/Dispose hiçbir etkisi yoktur.)

neden ilk çağrı DeflateStream kopya 0 bayt? Ayrıca, Read() ile döngü yapmayı denedim, ancak ilk görüşmede de sıfıra dönüyor, sonra ikinci olarak çalışıyor.


Güncelleştirme: Verileri sıkıştırmak için kullanıyorum yöntem.

public static string Base64Compress(string data, Encoding enc) 
{ 
    using (var ms = new MemoryStream()) 
    { 
     using (var ds = new DeflateStream(ms, CompressionMode.Compress)) 
     { 
      byte[] b = enc.GetBytes(data); 
      ds.Write(b, 0, b.Length); 
      ds.Flush(); 
      return Convert.ToBase64String(ms.ToArray()); 
     } 
    } 
} 
+0

. 'Ds.CopyTo()' nin ilkini 'ds.Read (...)' ile değiştirdiğinizde ne olur? İlk 'CopyTo()', akışın altbilgisini okuyarak tetikler. Oku() 'aynısını yapmalıdır. Sadece merak ediyorum. –

+0

Sıkıştırılmış sıkıştırılmış ve sıkıştırılmış sıkıştırılmış olmadığından emin misiniz? Deflate (veya gzip?) Verilerinin önündeki başka hiçbir şey olmadığından emin misiniz? – nos

+0

@Pieter: a '.Read()', aynı etkiye sahiptir - '0' değerini döndürür, ancak sonraki işlevi 'CopyTo() 'çalışmasına neden olur. – josh3736

cevap

İlgili konular