0

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

私のコードは .net にあり、できればすべて管理されたライブラリを探しています。

さまざまなライブラリ (SharpZlibLib、zlib.NET、Microsoft Compression.Deflate 名前空間) を見てみると、「書き込み」ごとに実行できる公開されているエントリが見つかりませんでした: - 圧縮されたバイト数を返します - BYTE 境界の保証 (FLUSH_SYNC ) - 理想的には、なりすましやコードの変更をあまり行わないこと

私が調べたライブラリには、(圧縮されたストリーム全体) を読み取ることができる出力ストリームがありますが、パケット自体へのアクセスは提供していません。

今のところ、contrib/dotzlib に多くの変更を加えた後、オリジナルの zlib ライブラリとネイティブの zlib1.dll を使用しています。

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

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

ありがとうございました

4

1 に答える 1

0

テストされていませんが、 zlib.netを使用すると、以下のようなものが動作すると予想されます。シークを避けるために here を使用していることに注意してください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));
}
于 2011-02-07T11:30:26.617 に答える