我需要实现一个特殊的 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 的第 3 方库?编辑:性能非常关键,因为这至少每秒完成一次。最后你会推荐我通过 Interop 使用 C-Lib 吗?我现在总是收到无效数据异常,我认为它与错误的校验和有关。这是我尝试使用但没有成功的实际代码:
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);