2011-02-07 8 views
0

私はmessage.rpmsg形式(ここではhttp://msdn.microsoft.com/en-us/library/ee625343(v=EXCHG.80).aspx)のMicrosoft仕様を実装しようとしています。仕様は、パケットにパッケージ化されたzlib圧縮ストリームの奇妙な組み合わせです。各パケットについて、私はパケットヘッダーに圧縮されていないストリームのバイト数(4096でなければなりません。そうでなければ、仕様にもかかわらずOutlook Cough)、圧縮バッファのサイズ、およびマジックマーカーを入れる必要があります。ストリームへの低レベルのアクセスでzlib形式で圧縮しようとしています

私のコードは.netにあり、好ましくは私はすべての管理ライブラリを探しています。さまざまなライブラリ(SharpZlibLib、zlib.NET、マイクロソフトCompression.Deflate名前空間)を見ると

- 私は、それぞれ「書き込み」のために尽くします公に利用可能なエントリを見つけることができませんでした: - 圧縮されたバイト の数を返します。 - 保証BYTE境界(FLUSH_SYNC) - 理想的には、なりすましやコードの変更があまりありません

私が見てきたライブラリには、読み込み可能な出力ストリーム(圧縮ストリーム全体)がありますが、提供しませんパケット自体へのアクセス。

contrib/dotzlibの多くの変更の後、元のzlibライブラリとネイティブのzlib1.dllを使用していますが、私の現在の回避策の明らかなパフォーマンスと展開の面倒を避けたいと思います

私はFLUSHモードを指定できるライブラリを探していて、各パケットのサイズにアクセスできます。

誰もがさまざまなライブラリ評価できる場合にも、(zlib.netを、SharpZipLibは最もユビキタスのようだ - ?何か)、および、そのようなパフォーマンス/品質/サポートなどの分野

おかげで多くの ウリ

+0

あなたが言及*ストリームから*読み込み - あなたはここで圧縮しているの? –

答えて

0

未テストですが、zlib.netを使用すると、以下のような動作が期待されます。ここではMemoryStreamを使用しています(これは一般的にはサポートされていないので、ブロック長は最大4kですので、これはまったく心配しません)。あなたが圧縮された長さを更新するために、後方求め、再び最後まで転送を求め、その後、データを書き込み、その後、圧縮された長さのためのダミー0を書くことができ求めることができます。

static void WriteBlock(Stream destination, byte[] arr, int offset, int length) 
{ 
    using (var ms = new MemoryStream()) 
    { 
     using (var zlib = new zlib.ZOutputStream(ms)) 
     { 
      zlib.Write(arr, offset, length); 
     } 
     WriteInt32LittleEndian(destination, 0x00000FA0); 
     WriteInt32LittleEndian(destination, length); 
     WriteInt32LittleEndian(destination, (int)ms.Length); 
     destination.Write(ms.GetBuffer(), 0, (int)ms.Length); 

    } 
} 
static void WriteInt32LittleEndian(Stream destination, int value) 
{ 
    destination.WriteByte((byte)value); 
    destination.WriteByte((byte)(value >> 8)); 
    destination.WriteByte((byte)(value >> 16)); 
    destination.WriteByte((byte)(value >> 24)); 
} 
関連する問題