1

私は DotNetZip 1.9.3 ライブラリを使用していますが、1 つのアーカイブ内の 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)

何か案は?

4

2 に答える 2

0

これはおそらく問題を示唆しています:

gzip と同様に、bzip2 は単なるデータ圧縮プログラムです。tar や ZIP のようなアーカイバではありません。プログラム自体には、複数のファイル、暗号化、またはアーカイブ分割のための機能はありませんが、代わりに、UNIX の伝統では、これらのタスクを tar や GnuPG などの別の外部ユーティリティに依存しています。

出典:ウィキペディア

于 2014-06-21T22:16:54.527 に答える