5

zlib.NETライブラリを使用して、zlib によって圧縮されたファイルを膨張させようとしています (おそらく Linux ボックスで)。これが私がやっていることです:

zlib.ZInputStream zinput =
    new zlib.ZInputStream(File.Open(path, FileMode.Open, FileAccess.Read));

while (stopByte != (data = zinput.ReadByte()))
{
  // check data here
}

zinput.Close();

データ バイトは圧縮されたデータ バイトと一致するので、何か間違ったことをしているに違いありません。

4

6 に答える 6

7

例外が発生した場合でも、「using」ステートメントを使用してストリームを閉じることができないことを除けば、それは問題ないように見えます。データは確実に圧縮されていますか?Linux ボックスで zlib を使用して解凍できますか?

ソースコードを見ると、かなりぞっとするようなものです。たとえばint Read(buffer, offset, length)、 を呼び出すと、その内部int Read()メソッドlengthを何度も呼び出すことになります。その種の不安定なスタートを考えると、コードを特に信頼できるかどうかはわかりませんが、少なくとも少しは動作することを期待していました! SharpZipLibを使用してみましたか?

于 2008-10-09T02:38:56.287 に答える
7

すべての仮想メソッドがオーバーライドされていると想定するのは間違いだったようですが、そうではありませんでした。私は zlib.ZInputStream.ReadByte() を使用していましたが、これは単なる継承された Stream.ReadByte() であり、インフレは行いません。

代わりに zlib.ZInputStream.Read() を使用しましたが、正常に機能しました。

于 2008-10-09T16:02:18.367 に答える
4

zlibヘッダー(最初の2バイト、78 9C)をスキップしてから、DeflateStream組み込みの.netを使用するとうまくいきました。

using(var input = File.OpenRead(...))
using(var output = File.Create(...))
{
    // if there are additional headers before the zlib header, you can skip them:
    // input.Seek(xxx, SeekOrigin.Current);

    if (input.ReadByte() != 0x78 || input.ReadByte() != 0x9C)//zlib header
        throw new Exception("Incorrect zlib header");

    using (var deflateStream = new DeflateStream(decryptedData, CompressionMode.Decompress, true))
    {
        deflateStream.CopyTo(output);
    }
}
于 2015-11-22T13:05:38.920 に答える
2

私は最近、以前は php を使用して zlib されていたドキュメントを、IE7 を含むさまざまなブラウザーやプラットフォームに提供するという不運に見舞われました。ドキュメントが zlib されており、gzip されていないことがわかったら (当時考えられていたように)、SharpZipLib を .NET Framework v4 で次のように使用ました ( Stream.CopyTo を利用)

public static byte[] DecompressZlib(Stream source)
{
    byte[] result = null;
    using (MemoryStream outStream = new MemoryStream())
    {
        using (InflaterInputStream inf = new InflaterInputStream(source))
        {
            inf.CopyTo(outStream);
        }
        result = outStream.ToArray();
    }
    return result;
}

SharpZipLib から使用するクラスについて誰かが助けを必要とする場合に備えて、ここに置くと思います。

于 2013-03-12T14:12:58.943 に答える
2

以下のコードは皆さんを助けることができます。オブジェクトをインスタンス化し、関数を利用します。

public class FileCompressionUtility
{
    public FileCompressionUtility()
    {
    }

    public static void CopyStream(System.IO.Stream input, System.IO.Stream output)
    {
        byte[] buffer = new byte[2000];
        int len;
        while ((len = input.Read(buffer, 0, 2000)) > 0)
        {
            output.Write(buffer, 0, len);
        }
        output.Flush();
    }

    public void compressFile(string inFile, string outFile)
    {
        System.IO.FileStream outFileStream = new System.IO.FileStream(outFile, System.IO.FileMode.Create);
        zlib.ZOutputStream outZStream = new zlib.ZOutputStream(outFileStream, zlib.zlibConst.Z_DEFAULT_COMPRESSION);
        System.IO.FileStream inFileStream = new System.IO.FileStream(inFile, System.IO.FileMode.Open);
        try
        {
            CopyStream(inFileStream, outZStream);
        }
        finally
        {
            outZStream.Close();
            outFileStream.Close();
            inFileStream.Close();
        }
    }

    public void uncompressFile(string inFile, string outFile)
    {
        int data = 0;
        int stopByte = -1;
        System.IO.FileStream outFileStream = new System.IO.FileStream(outFile, System.IO.FileMode.Create);
        zlib.ZInputStream inZStream = new zlib.ZInputStream(System.IO.File.Open(inFile, System.IO.FileMode.Open, System.IO.FileAccess.Read));
        while (stopByte != (data = inZStream.Read()))
        {
            byte _dataByte = (byte)data;
            outFileStream.WriteByte(_dataByte);
        }

        inZStream.Close();
        outFileStream.Close();
    }
}
于 2009-01-23T16:35:03.900 に答える
0

サンプルコードを詳しく見てください。通常のFilestreamからZOutputStreamにデータをコピーしています。解凍はそのレイヤーを介して行われている必要があります。

private void decompressFile(string inFile, string outFile)
{
    System.IO.FileStream outFileStream = new System.IO.FileStream(outFile, System.IO.FileMode.Create);
    zlib.ZOutputStream outZStream = new zlib.ZOutputStream(outFileStream);
    System.IO.FileStream inFileStream = new System.IO.FileStream(inFile, System.IO.FileMode.Open);          
    try
    {
        CopyStream(inFileStream, outZStream);
    }
    finally
    {
        outZStream.Close();
        outFileStream.Close();
        inFileStream.Close();
    }
}
于 2008-10-09T04:15:31.820 に答える