1

zlib の deflate を使用して文字列を膨張させようとしていますが、適切なヘッダーがないために失敗しているようです。この問題に対するC#の解決策は次のとおりであることを他の場所で読みました。

public static byte[] FlateDecode(byte[] inp, bool strict) {
    MemoryStream stream = new MemoryStream(inp);
    InflaterInputStream zip = new InflaterInputStream(stream);
    MemoryStream outp = new MemoryStream();
    byte[] b = new byte[strict ? 4092 : 1];
    try {
        int n;
        while ((n = zip.Read(b, 0, b.Length)) > 0) {
            outp.Write(b, 0, n);
        }
        zip.Close();
        outp.Close();
        return outp.ToArray();
    }
    catch {
        if (strict)
            return null;
        return outp.ToArray();
    }
}

しかし、私はC#について何も知りません。文字列にプレフィックスを追加しているだけだと推測できますが、そのプレフィックスが何であるかはわかりません。誰かがこの関数 (またはヘッダーの作成と文字列の連結だけ) を C++ で表現できるでしょうか?

膨らませようとしているデータは、zlib デフレを使用して PDF から取得されます。

ありがとう、ワイアット

4

2 に答える 2

1

私は、ネイティブの .Net Framework クラスよりも、相互運用のためにSharpZipLibを使用した方が運が良かったです。zlibこれは、C++ (zlibネイティブ) および Java の圧縮クラスからのストリームを、おかしな作業を必要とせずに正しく処理します。

于 2010-12-14T17:09:31.087 に答える
0

プレフィックスが表示されません。申し訳ありません。ロジックは次のようになります。申し訳ありませんが、これは C++ ではありません:

MemoryStream stream = new MemoryStream(inp);
InflaterInputStream zip = new InflaterInputStream(stream);

渡されたデータからインフレート ストリームを作成する

MemoryStream outp = new MemoryStream();

出力用のメモリ バッファ ストリームを作成する

byte[] b = new byte[strict ? 4092 : 1];
try {
    int n;
    while ((n = zip.Read(b, 0, b.Length)) > 0) {

厳格モードの場合は、最大 4092 バイト(非厳格モードでは 1 バイト) をバイト バッファーに読み込みます。

        outp.Write(b, 0, n);

デコードされたすべてのバイト (4092 より小さい可能性があります) を出力メモリ バッファー ストリームに書き込みます。

    zip.Close();
    outp.Close();
    return outp.ToArray();

クリーンアップして、出力メモリ バッファ ストリームを配列として返します。

しかし、私は少し混乱しています:を経由するのではなく、要素で配列を切り取ってそれを返さbないのはなぜですか? コードはまた、メモリ ストリームのクリーンアップと例外 (例: の使用) に注意を払う必要がありますが、それらはすべて I/O ファイル ハンドルに対応しておらず、メモリ構造のみに対応しているため、それほど重要ではないと思います。nMemoryStreamzipusingIDisposable

于 2010-12-14T17:19:31.037 に答える