尝试使用zlib格式进行压缩,并对流进行低级访问

时间:2011-02-07 10:43:50

标签: .net zlib compression deflate data-compression

我正在尝试为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命名空间) - 我找不到每个'Write'可以执行的公开条目: - 返回压缩字节数 - 保证BYTE边界(FLUSH_SYNC) - 理想情况下,无需欺骗或更改代码

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

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

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

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

非常感谢 URI

1 个答案:

答案 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));
}