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 命名空间)-我找不到每个“写入”都会执行的公开可用条目:-返回压缩字节数-保证字节边界(FLUSH_SYNC ) - 理想情况下,无需欺骗或更改太多代码

我看过的库有一个输出流,您可以从中读取(整个压缩流) - 但不提供对数据包本身的访问。

目前,在对 contrib/dotzlib 进行多次修改后,我使用的是原始 zlib 库和本机 zlib1.dll - 但是,我想避免当前解决方法带来的明显性能和部署麻烦

所以我正在寻找一个库,它可以让我指定 FLUSH 模式,并让我访问每个数据包的大小。

此外,如果有人可以评价各种库(zlib.net,SharpZipLib 似乎是最普遍的——还有什么?),以及性能/质量/支持等领域

非常感谢 Uri

4

1 回答 1

0

未经测试,但使用zlib.net我希望下面的东西可以工作;请注意,我在MemoryStream这里使用 a 是为了避免必须寻找(因为不能普遍支持 - 因为块长度最大为 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 回答