c# - DotNetZip ZipInputStream 问题

标签 c# aes dotnetzip bzip2 zipinputstream

我使用 DotNetZip 1.9.3 库,并且在使用 BZip2 和 AES256 处理 1 个存档中的 1 个条目时遇到了问题。 ZipOutputStream 工作正常,但 ZipInputStream 获取错误的 BZip2 header 。如果我使用常见的放气算法,一切都很好。

我创建 ZipOutputStream(从文件流):

protected override Stream OnCreateStream(string path)
{
    var encryptedStream = new ZipOutputStream(base.OnCreateStream(path))
    {
        Password = this.Password,
        Encryption = EncryptionAlgorithm.WinZipAes256,
   //     CompressionMethod = CompressionMethod.BZip2,
    };
    var entry = encryptedStream.PutNextEntry("_");
    return encryptedStream;
}

当工作完成时,我总是处理 ZipOutputStream。

流式读取 zip 存档:

protected override Stream OnCreateStream(string path)
{
    ZipInputStream stream = new ZipInputStream(base.OnCreateStream(path))
    {
        Password = this.Password
    };
    var entry = stream.GetNextEntry();
    return stream;
}

如果我取消注释压缩方法并尝试读取 ZipInputStream 我会得到异常:

Not a valid BZip2 stream. byte 1, expected '90', got '107'
   в Ionic.BZip2.BZip2InputStream.CheckMagicChar(Char expected, Int32 position)
   в Ionic.BZip2.BZip2InputStream.init()
   в Ionic.BZip2.BZip2InputStream..ctor(Stream input, Boolean leaveOpen)
   в Ionic.Zip.ZipEntry.GetExtractDecompressor(Stream input2)
   в Ionic.Zip.ZipEntry.InternalOpenReader(String password)
   в Ionic.Zip.ZipInputStream.SetupStream()
   в Ionic.Zip.ZipInputStream.Read(Byte[] buffer, Int32 offset, Int32 count)
   в System.IO.StreamReader.ReadBuffer(Char[] userBuffer, Int32 userOffset, Int32 desiredChars, Boolean& readToUserBuffer)
   в System.IO.StreamReader.Read(Char[] buffer, Int32 index, Int32 count)

有什么想法吗?

最佳答案

我知道这是一个很老的话题,但对于那些在谷歌上搜索解决方案的人来说可能仍然有用。

我注意到调用压缩属性 setter 的顺序很重要。与

zip.CompressionMethod = CompressionMethod.BZip2;
zip.CompressionLevel = Ionic.Zlib.CompressionLevel.BestCompression;

AddEntry 之前设置会使 DotNetZip 无法读取 ZIP 文件。设置 CompressionMethodCompressionLevel 的正确位置是在保存之前:

using (var zip = new ZipFile(zipPath, Encoding.UTF8))
{
    // set zip properties except compression ones
    zip.Encryption = EncryptionAlgorithm.WinZipAes256;
    zip.Password = "pass";

    // add entries
    zip.AddEntry("whatever", stream);

    // set compression just before Save()
    zip.CompressionMethod = CompressionMethod.BZip2;
    zip.CompressionLevel = Ionic.Zlib.CompressionLevel.BestCompression;

    zip.Save();
}

关于c# - DotNetZip ZipInputStream 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24328239/

相关文章:

c# - Entity Framework 中的上下文中缺少 AsNoTracking() 方法

c# - Cron Scheduler 每天午夜 12 点

bash - AES128-CBC "bad magic number"和 "error reading input file"

python - pycrypto AES CBC

c# - DotNetZip 不从 WinZip 中提取最佳压缩

xamarin - 如何以 Xamarin 形式解压缩下载的 Zip 文件

c# - 从 .NET Core 的类库中加载资源

c# - 如何使用 ADO.NET 返回 IEnumerable<>?

C#:AES 错误:填充无效且无法删除。相同的 key 和一切,帮助

c# - .Extract 上的 DotNetZip BadReadException