2016-04-06 20 views
2

Bir zip dosyası base64 dizesi alıyorum, byte [] öğesine dönüştürün, belleği açın, içeriği değiştirin ve sonra yeniden base64 dizesine yeni byte [] komutunu 'sıkıştırın'.C# - Sıkıştırılmış bayt []

Sorunum, yeni bayt [] 'ı zip biçimine nasıl "sıkıştıracağımı" bilmiyorum.

public string ModifyZipContent(string base64) { 
    ZipPackage zipPackage = null; 
    MemoryStream memoryStream = null; 

    long lenght; 

    byte[] data = Convert.FromBase64String(base64); 
    byte[] buffer; 
    byte[] newData; 

    int arrayOffset = 0; 

    memoryStream = new MemoryStream(); 
    memoryStream.Write(data, 0, data.Length); 

    zipPackage = (ZipPackage)Package.Open(memoryStream, FileMode.Open); 

    PackagePartCollection zipParts = zipPackage.GetParts(); 

    // this is awful 
     foreach(ZipPackagePart zipPart in zipParts) { 
      using(Stream stream = zipPart.GetStream()) { 
       arrayOffset += (int)stream.Length; 
      } 
     } 

     newData = new byte[arrayOffset]; 
    // end 

    arrayOffset = 0; 
    foreach(ZipPackagePart zipPart in zipParts) { 
     using(Stream stream = zipPart.GetStream()) { 
      lenght = stream.Length; 
      buffer = new byte[lenght]; 

      stream.Read(buffer, 0, (int)lenght); 

      Buffer.BlockCopy(buffer, 0, newData, arrayOffset, buffer.Length); 
      arrayOffset += buffer.Length; 
     } 
    } 

    return Convert.ToBase64String(newData); 
} 
+0

PS: Ben istediğim için bu özel durumda, verilerde herhangi bir değişiklik yapmayın Yeni base64 dizesinin eskisine eşit olup olmadığını bilmek, yani eğer doğruysa, değişiklik yapabilirim. – KISKE

+5

Olası çoğaltılabilir [ZipPackage'ı bir zip oluşturmak için nasıl kullanılır] (http://stackoverflow.com/questions/12888805/how-to-use-zippackage-to-create-a-zip) –

+0

FYI bir bayt [ ] 'base64'e" sıkıştırmaz "- aslında% 33'lük bir _bigger_ dizisi ile sonuçlanır. Ham ikili verileri alır ve ASCII karakterlerinin bir alt kümesinde kodlar. –

cevap

0

Tam olarak bu test etmedim ama bu satırlar boyunca bir şey çalışması gerekir ...

// Requires System.IO.Compression using statement. 

byte[] bytes = new byte[256]; // Your byte[] would be here instead of this empty one. 
using (var zipFile = ZipFile.Open("C:/ZipFile.zip", ZipArchiveMode.Update)) 
{ 
    var entry = zipFile.CreateEntry("YourEntryPathHere"); 
    using (var stream = entry.Open()) 
    { 
     stream.Write(bytes, 0, bytes.Length); 
    } 
} 
İlgili konular