Zlib for Mono / .Net没有已知的校验和

时间:2009-05-07 16:13:58

标签: c# mono compression checksum zlib

我需要实现一个特殊的ZLib实现,它应该在.Net和Mono下运行。 数据/字符串消息通过套接字接收,因此缺少校验和。 这是关于原始字符串数据,而不是关于文件。

    unsigned char zlib_header[]={
// custom additional Zlib Id
       'Z',    // Our own ID
// The normal GZIP header
       0x1f,
       0x8b,   // GZIP ID
       0x08,   // Deflated
       0x00,   // Flags
       0, 0, 0, 0, // Timestamp,
       0x00,   // Extra flags
       0x00,   // OS identifier
// afterwards compressed data without a checksum
};

我曾尝试使用GZipStream和DeflateStream解压缩数据,但我认为GZStream因缺少校验和而失败。我也尝试了各种补偿,但没有运气。 不使用校验和,因为无论如何都是通过套接字接收数据 - 因此ZLib校验和将是额外的开销。 我是否遗漏了某些内容,或者您​​能解释我如何添加校验和并调用正确的库,还是应该查看支持Mono和.Net的第三方库? 编辑:性能非常关键,因为这至少每秒一次。你会建议我最后通过Interop使用C-Lib吗? 我总是收到Invalid Data Exception,我认为它与错误的校验和有关。 这是我尝试使用但没有成功的实际代码:

const int HeaderSize = 1;
System.IO.MemoryStream ms = new System.IO.MemoryStream(compressedBuffer, HeaderSize, compressedBuffer.Length-HeaderSize);//remove the additional Z from the header
GZipStream zipStream = new GZipStream(ms, CompressionMode.Decompress,true);
byte[] deCompressedBytes = new byte[actualBufferLength* 10];
int resultSize=zipStream.Read(deCompressedBytes, 0, actualBufferLength);//get rid of the header      
UTF8Encoding enc = new UTF8Encoding();
string result = enc.GetString(deCompressedBytes, 0, resultSize);

2 个答案:

答案 0 :(得分:2)

你确定它与校验和有关吗?

32位校验和在GZIP格式中不是可选的。我不明白你的意思是“通过套接字接收数据因此缺少校验和”。如果你通过信鸽获得数据并不重要;如果它是有效的GZIP流,则它必须具有32位CRC。谁或什么产生了源数据?

GZIP规范中有一个可选部分 - 16位校验和。 (它的包含也不取决于如何创建GZIP字节流。)System.IO.GZipStream类很乐意接受缺少CRC16的GZIP流,以及包含它的GZIP流。

您在代码中还有其他一些问题。代码中的actualBufferLength - 这是什么?保存解压缩数据当然不是缓冲区的长度。那是10倍。但10倍似乎很随意。对于非常可压缩的数据,您可能会超过10倍。我建议你在减压中使用流媒体方法。

至于你是否能够处理每秒1次的解压缩,是的,System.IO.GZipStream对于足够小的数据块来说足够快。可能没有必要转到本机C / C ++库。

ps:DotNetZip库包含一个开源的GZipStream;您可以开箱即用,或者如果您愿意,只要您需要,就可以抓住GZip的东西。

答案 1 :(得分:1)

只需使用DeflateStream而不是GZipStream。