代码之家  ›  专栏  ›  技术社区  ›  weismat

zlib for mono/.net,没有已知的校验和

  •  0
  • weismat  · 技术社区  · 15 年前

    我需要实现一个特殊的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吗? 我现在总是收到无效的数据异常,我假设它与错误的校验和有关。 这是我试图使用但没有成功的实际代码:

    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 回复  |  直到 15 年前
        1
  •  2
  •   Cheeso    15 年前

    你确定这和校验和有关吗?

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

    gzip规范中有一个可选部分—16位校验和。(它的包含也不取决于gzip bytestream是如何创建的。)system.io.gzip stream类将欣然接受缺少此crc16的gzip流以及包含它的gzip流。

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

    至于您是否能够处理每秒1次的解压,是的,system.io.gzipstream对于足够小的数据块来说足够快。很可能没有必要去本地的C/C++库。

    PS: DotNetZip 库中包含一个开放源码的gzip流;您可以直接使用它,或者如果您愿意,您只需在需要的时候获取gzip内容即可。

        2
  •  1
  •   lupus    15 年前

    只需使用deflatestream而不是gzipstream。