0

Zlib.net.dll を使用して文字列を圧縮解除する方法を探すのに 3 時間を費やしましたが、役立つものは何も見つかりませんでした。

私の文字列は zlib.dll を使用する古い VB6 プログラムによって圧縮されているため、文字列を圧縮解除するたびにファイル アクセスを使用したくありません。

問題は、圧縮前の byte[] の元のサイズを知る必要があることです。または、動的配列を使用してデータをデコードすることもできます。

コードは次のとおりです。

    private string ZlibNetDecompress(string iCompressData, uint OriginalSize)
    {
        byte[] todecode_byte = Convert.FromBase64String(iCompressData);
        byte[] lDecodeData = new byte[OriginalSize];
        string lTempoString = System.Text.Encoding.Unicode.GetString(todecode_byte);
        todecode_byte = System.Text.Encoding.Default.GetBytes(lTempoString);
        string lReVal = "";
        MemoryStream outStream = new MemoryStream();
        MemoryStream InStream = new MemoryStream(todecode_byte);
        zlib.ZOutputStream outZStream = new zlib.ZOutputStream(outStream);
        try
        {
            CopyStream(InStream, outZStream);
            lDecodeData = outStream.GetBuffer();
            lReVal = System.Text.Encoding.Default.GetString(lDecodeData);
        }

        finally
        {
            outZStream.Close();
            InStream.Close();
        }
        return lReVal;
    }

    private 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();
    }
4

1 に答える 1

0

フレームワークから GZipStreamClass を使用できます。

var data = new byte[resultSizeMax];
using (Stream ds = new DeflateStream(stream, CompressionMode.Decompress)) 
  for (var i=0; i< 1000; i+=ds.Read(data, i,1000-i);
于 2013-01-25T16:16:06.743 に答える