我正在尝试为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
答案 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));
}