如何使用zlib计算CRC32-C校验和

时间:2018-05-15 06:18:18

标签: zlib crc

我正在使用C zlib API,因为它具有crc32_combine函数来将校验和连接在一起,而Boost则没有。

但是,我需要使用多项式0x1EDC6F41来实现CRC32-C(Castagnoli)校验和,而不是标准的CRC32校验和。

使用Boost,我显然可以使用:

#include <boost/crc.hpp>

using crc_32c_type = boost::crc_optimal<32, 0x1EDC6F41, 0xFFFFFFFF, 0xFFFFFFFF, true, true>;
crc_32c_type result;
result.process_bytes(reinterpret_cast<const char*>(&buffer), len);
return result.checksum();

哪个可以使用0x1EDC6F41多项式。

使用zlib,我有类似的方法吗?

2 个答案:

答案 0 :(得分:3)

zlib是开源的。您可以简单地获取源代码并根据自己的需要进行修改。您可以将行odd[0] = 0xedb88320UL;更改为Castagnoli多项式的反射。

答案 1 :(得分:0)

对于目标C

花点时间找一个可行的。

//------------------------------------------------------------------------------------
//                    crc32c
//           Calculate crc32c (Castagnoli) Checksum
//------------------------------------------------------------------------------------
+ (uint32_t) crc32c:(NSData *)data {
    /* CRC-32C (iSCSI) polynomial in reversed bit order. */


    int k;
    const unsigned char *buf = [data bytes];
    unsigned long len = [data length];
    uint32_t crc = 0xFFFFFFFF;
    while (len--) {
        crc ^= *buf++;
        for (k = 0; k < 8; k++)
            //CRC-32C polynomial 0x1EDC6F41 in reversed bit order.
            crc = crc & 1 ? (crc >> 1) ^ 0x82f63b78 : crc >> 1;
    }
    return ~crc;
}