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