【问题标题】:DotNetZip ZipInputStream issueDotNetZip ZipInputStream 问题
【发布时间】:2014-06-20 13:18:26
【问题描述】:

我使用 DotNetZip 1.9.3 库,但在 1 个存档中使用 BZip2 和 AES256 时遇到了问题。 ZipOutputStream 工作正常,但 ZipInputStream 得到错误的 BZip2 标头。如果我使用通用放气算法,一切都很好。

我创建 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)

有什么想法吗?

【问题讨论】:

    标签: c# aes dotnetzip bzip2 zipinputstream


    【解决方案1】:

    我知道这是一个很老的话题,但它可能对搜索解决方案的人仍然有用。

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

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

    AddEntry 之前设置会使 ZIP 文件无法被 DotNetZip 读取。设置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();
    }
    

    【讨论】:

    • 这是我遇到的问题。有趣的是,在保存之前使用压缩级别和压缩方法,我的文件大了 10-20%.. 但它们也可读..
    【解决方案2】:

    这可能暗示了问题:

    和 gzip 一样,bzip2 只是一个数据压缩器。它不是 tar 或 ZIP 之类的存档器;该程序本身没有用于多个文件、加密或存档拆分的功能,但是在 UNIX 传统中,这些任务依赖于单独的外部实用程序,例如 tar 和 GnuPG。

    来源:Wikipedia

    【讨论】:

      猜你喜欢
      • 2011-02-03
      • 1970-01-01
      • 2010-10-11
      • 1970-01-01
      • 2011-03-13
      • 1970-01-01
      • 1970-01-01
      • 2013-06-25
      • 1970-01-01
      相关资源
      最近更新 更多