【发布时间】:2016-04-06 14:07:00
【问题描述】:
我收到一个 zip 文件 base64 字符串,转换为 byte[],在内存中打开,修改内容,然后将新的 byte[] 再次“压缩”为 base64 字符串。
我的问题,我不知道如何将新字节[]“压缩”为 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);
}
【问题讨论】:
-
PS:在这种特殊情况下,我不会对数据进行任何更改,因为我想知道新的 base64 字符串是否等于旧字符串,所以,如果是真的,我可以进行更改.
-
仅供参考,将
byte[]转换为 base64 不会“压缩”它 - 它实际上会导致 33% 更大 数组。它采用原始二进制数据并编码为 ASCII 字符的子集。 -
似乎 File.WriteAllBytes 完成了所有工作,但我无法使用它,因为我无法访问磁盘,我需要在内存中“即时”执行并返回修改后的邮编。我正在努力解释自己,如果我不能解释,对不起