2016-04-06 6 views
2

Я получаю строку base64 zip-файла, преобразовываю в байт [], открываю в памяти, изменяю содержимое и затем снова сжимаю новый байт [] на строку base64.C# - Compress byte []

Моя проблема, я не знаю, как «сжать» новый байт [] в формат zip.

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: В данном конкретном случае, я не делаю каких-либо изменений в данных, потому что я хочу чтобы знать, соответствует ли новая base64 строка старой, поэтому, если это правда, я могу вносить изменения. – KISKE

+5

Возможный дубликат [Как использовать ZipPackage для создания zip] (http://stackoverflow.com/questions/12888805/how-to-use-zippackage-to-create-a-zip) –

+0

FYI преобразование 'byte [ ] 'to base64 не« сжимает »его - на самом деле это приводит к 33% _bigger_ массиву. Он берет необработанные двоичные данные и кодирует в подмножестве символов ASCII. –

ответ

0

Я не в полной мере испытал это, но что-то вдоль этих линий должно работать ...

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