2009-05-07 4 views
0

.NetとMonoで実行する特別なZLib実装を実装する必要があります。 データ/文字列メッセージがソケット経由で受信されたため、チェックサムがありません。 これは未処理の文字列データであり、ファイルに関するものではありません。既知のチェックサムなしのMono/.Net用Zlib

unsigned char zlib_header[]={ 
// custom additional Zlib Id 
     'Z', // Our own ID 
// The normal GZIP header 
     0x1f, 
     0x8b, // GZIP ID 
     0x08, // Deflated 
     0x00, // Flags 
     0, 0, 0, 0, // Timestamp, 
     0x00, // Extra flags 
     0x00, // OS identifier 
// afterwards compressed data without a checksum 
}; 

私はGZipStreamとDeflateStreamでデータを解凍しようとしましたが、私はGZStreamが見つからないため、チェックサムの失敗だと思います。私はまた様々なオフセットを試みたが運がなかった。 データはソケット経由で受信されるため、チェックサムは使用されません。したがって、ZLibチェックサムは追加のオーバーヘッドになります。 チェックサムを追加して適切なライブラリを呼び出す方法を教えてください。またはMonoと.Netをサポートするサードパーティのライブラリを見てください。 編集:パフォーマンスは少なくとも1秒に1回は非常に重要です。 C-LibをInterop経由で使用することを最後にお勧めしますか? 私は現時点で常に無効なデータ例外を受け取り、間違ったチェックサムに関係していると考えます。 これは私が成功せず使用しようとした実際のコードです:

const int HeaderSize = 1; 
System.IO.MemoryStream ms = new System.IO.MemoryStream(compressedBuffer, HeaderSize, compressedBuffer.Length-HeaderSize);//remove the additional Z from the header 
GZipStream zipStream = new GZipStream(ms, CompressionMode.Decompress,true); 
byte[] deCompressedBytes = new byte[actualBufferLength* 10]; 
int resultSize=zipStream.Read(deCompressedBytes, 0, actualBufferLength);//get rid of the header  
UTF8Encoding enc = new UTF8Encoding(); 
string result = enc.GetString(deCompressedBytes, 0, resultSize); 

答えて

2

チェックサムと関係がありますか?

32ビットのチェックサムは、GZIP形式ではオプションではありません。私はあなたが "データがソケットを介して受信され、したがってチェックサムが欠落している"ということを理解していません。あなたがキャリアの鳩を介してデータを取得するかどうかは関係ありません。それが有効なGZIPストリームであれば、それは32ビットCRCを持たなければならない。ソースデータを作成したのは誰ですか?

GZIP仕様には16ビットのチェックサム(オプション)があります。 System.IO.GZipStreamクラスは、このCRC16が存在しないGZIPストリームと、それを含むGZIPストリームを喜んで受け入れます。このGZIPストリームは、GZIPストリームに含まれています(この組み込みは、GZIPバイトストリームの作成方法を前提としていません)。

コードには他にもいくつか問題があります。あなたのコードの実際のBufferLength - それは何ですか?確かに、圧縮解除されたデータを保持するバッファの長さではありません。それは10倍です。しかし、10倍はかなり自由に見えます。非常に圧縮可能なデータの場合、10倍を超える可能性があります。私はあなたが減圧でストリーミングアプローチを使用することをお勧めします。

1秒間に1回の圧縮を処理できるかどうかについては、はい、System.IO.GZipStreamはデータが十分に小さいほど十分に高速です。おそらくネイティブのC/C++ライブラリに行く必要はありません。

ps:DotNetZipライブラリには、オープンソースのGZipStreamが含まれています。あなたはそれをそのまま使うことができますし、好きなだけの場合は、GZipのものを手に入れることもできます。

+0

私は離れた場所から第三者と統合しており、明らかにソフトウェア内部にバグがあります。ネットワークストリームを正しくフラッシュしていません。とにかく助けてくれてありがとう。 – weismat

1

ただDeflateStreamの代わりGZipStreamを使用します。

関連する問題