問題タブ [deflatestream]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
3 に答える
254 参照

.net - GZipStream/DeflateStream が圧縮データ以上のものを消費しようとするのを防ぐ

次のようなファイルを作成できます。

今のようなファイルを読むとき

私がチェックした場合、実際の13293バイトの圧縮されたバイトではなく、GZipStream( についても同じですDeflateStream)が から16384バイトを読み取ることがわかりました。stream

ファイルの圧縮部分のサイズも、圧縮データに続くバイト数も事前にわからないと仮定すると、GzipStream/DeflateStream を使用する方法はありますか

  1. そのため、圧縮されたデータのみを読み取りますstream
  2. または、少なくとも圧縮データ部分のサイズを把握して、stream.Position -= actuallyRead - compressedSize手動でできますか?
0 投票する
1 に答える
247 参照

.net - Flush メソッドは DeflateStream で何をしますか?

Flush メソッドは DeflateStream で何をしますか?

DeflateStream.Flush メソッドの説明は次のとおりです。

現在のストリーム オブジェクトの内部バッファーの内容を基になるストリームにフラッシュします。

これは正確な説明ですか?もしそうなら、それはどういう意味ですか?

混乱のポイントを詳しく説明すると、DeflateStream コンストラクターには、「圧縮または解凍するストリーム」として説明されている Stream 引数が必要です。それは「根底にある流れ」ですか?もしそうなら、圧縮または解凍しているストリームにバッファをフラッシュするのはなぜですか? そうでない場合、「根底にあるストリーム」とは何ですか?

0 投票する
1 に答える
425 参照

c# - Deflate ストリームが読み取れない

DeflateStream.Read が機能していません。圧縮されたメモリ ストリームから読み取ろうとしていますが、読み取りのバイト配列引数が空のままです。

arrは常に空 (すべてのバイトがゼロ) で、memoryStream.ToArray() にはデータがあります。

arr 引数のクイックウォッチ

0 投票する
2 に答える
599 参照

c# - 基になるストリームを最後まで進める DeflateStream

ここでレイアウトされたパックファイルの形式に従って、gitパックファイルからgitオブジェクトを読み込もうとしています。圧縮データにアクセスすると、問題が発生します。System.IO.Compression.DeflateStreamを使用して zlib 圧縮オブジェクトを解凍しようとしています。最初の 2 バイトをスキップして、基本的に zlib ヘッダーを無視します。とにかく最初のオブジェクトのこれらの 2 バイトは 789C です。今、トラブルが始まります。

1) 解凍されたオブジェクトのサイズしか知りません。DeflateStream の Read メソッドのドキュメントには、「解凍されたバイト数を指定のバイト配列に読み込む」と記載されています。これは私が望んでいることですが、このカウントを圧縮されたデータのサイズに設定している人がいますが、私たちの 1 人が間違っています。

2)返されたデータは正しいと思います(人間が読めるデータは正しく見える)が、根底にあるストリームを最後まで進めています!たとえば、解凍された 187 バイトを要求し、残りの 212 バイトをストリームの最後まで読み取ります。ストリーム全体が 228 バイトであり、デフレート読み取りの最後にあるストリームの位置は 187 バイトになり、228 バイトになりました。また、私が使用するすべてのストリームがシークできるわけではありません。これは、ストリーム全体を消費するために予期される動作ですか?

0 投票する
1 に答える
81 参照

c# - クラスをシリアライズしてファイルに圧縮する

クラスをファイルに書き込んで、ファイルからクラスを開こうとしています。これは私にとってはうまくいきます。ただし、ファイル サイズが非常に大きくなります。(65 MB、.rar で圧縮すると 1 MB になります)。

これにより、ファイルに書き込む前にデータを圧縮できると考える理由が得られました。

私の元の機能は次のとおりです。

圧縮するには、次のことを試しましたが、システムクラスにロードするときに正しく機能しないようです:

DeflateStream を間違って使用していますか? これを機能させるにはどうすればよいですか?

0 投票する
0 に答える
251 参照

c# - Deflatestream - 解析が完了する前にストリームの終わりに達しました

List を FileStream に書き込もうとしています。オブジェクトが大きすぎるため、リストを均等に分散されたチャンクに分割し、DeflateStream を使用して FileStream に追加してデータを圧縮します。これはすべてうまくいきます。

ただし、解凍するために同じことをしようとすると、「解析が完了する前にストリームの終わりに達しました」というエラーが発生します。解凍するコードは次のとおりです。

私が気付いたのは、ユーザーの最初のチャンクがうまく結果に書き込まれていることです。ただし、ユーザーの 2 番目のチャンクで開始する必要がある場合は、すぐにエラーが発生します (2 番目のチャンクを取得しようとする前でさえあるようです)。これについて私は何ができますか、それとも間違っていますか?

@Edit 10:43 - 16-10-2015 追加のコメント

DeflateStream をスキップして FileStream のみを使用すると、魅力的に機能します。

Compress メソッド (この関数を x 回、すべてのチャンクを 1 回呼び出します):

0 投票する
0 に答える
1364 参照

c# - deflatestream を使用してバイト ストリームを解凍する

TCPソケットを使用して接続するサーバーとクライアントがあります。クライアント (C++ で記述) で、 zlibライブラリを使用して文字列 (str) を圧縮します。

次に、サーバーに送信します。これは、圧縮された文字列をソケットに書き込むコード行です。

サーバー (C# で記述) で、圧縮されたバイトのストリームをソケットから受信し、DeflateStream クラスを使用して解凍します。

これが解凍機能です。

圧縮プロセスとソケットを介した圧縮バイトの送信は機能しますが、上記の Decompress 関数の行で例外が発生しdecompressor.CopyTo(output);ます: System.IO.InvalidDataException: ブロックの長さが補数と一致しません。

誰かが問題が何であるかを知っていますか?どうすれば解決できますか?

編集:解凍プロセスの開始前に、最初の2バイトをスキップしようとしました。

0 投票する
1 に答える
567 参照

c# - 圧縮解凍できません

WP8 でファイルからコンテンツを読み取ってデータを圧縮および解凍しようとしています。圧縮または解凍できません。結果の文字列を圧縮すると、常に空になります。解凍中に「タイプ 'System.IO.InvalidDataException' の例外が SYSTEM.IO.COMPRESSION.NI.DLL で発生しましたが、ユーザー コードで処理されませんでした。

追加情報: ブロックの長さが補数と一致しません。」

コードは以下です

何が問題なのかを理解するのを手伝ってください。

0 投票する
1 に答える
3454 参照

c# - ファイルからメモリ内 zip を作成する

DeflateStream は、標準の .zip アーカイブとして保存できるアーカイブ ストリームを作成することになっていますか?

ローカル ファイルからインメモリ zip (リモートで送信) を作成しようとしています。DeflateStream を使用して、ローカル ディスク上のファイルから圧縮されたバイト配列を取得しました。

これはうまくいきます。ただし、結果のバイトを zip ファイルにダンプすると、次のようになります。

結果の .zip アーカイブを、Windows 組み込みの .zip 機能 (または他のサード パーティのアーカイブ ツール) で開くことができません。

私が現在計画している代替手段は、ZipArchive を使用することです - ただし、それにはディスク上に一時ファイルを作成する必要があります (最初にファイルを別のディレクトリにコピーし、次に圧縮し、バイト配列に読み取ってから削除します)。