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

如何用zlib计算CRC32-C校验和,zlib,crc,Zlib,Crc,我之所以使用czlibapi,是因为它有crc32\u combine函数将校验和连接在一起,而Boost函数则没有 但是,我需要实现CRC32-C(Castagnoli)校验和,使用多项式0x1EDC6F41,而不是标准的CRC32校验和 使用Boost,我显然可以使用: #include <boost/crc.hpp> using crc_32c_type = boost::crc_optimal<32, 0x1EDC6F41, 0xFFFFFFFF, 0xFFFFFFF

我之所以使用czlibapi,是因为它有
crc32\u combine
函数将校验和连接在一起,而Boost函数则没有

但是,我需要实现CRC32-C(Castagnoli)校验和,使用多项式
0x1EDC6F41
,而不是标准的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();
#包括
使用crc_32c_type=boost::crc_optimal;
crc_32c_型结果;
结果。处理字节(重新解释转换(&buffer),len;
返回结果。校验和();
它可以使用
0x1EDC6F41
多项式


有没有类似的方法可以让我用zlib实现这一点?

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

zlib是开源的。您只需获取源代码并根据自己的需要进行修改。您可以更改行:
odd[0]=0xedb88320UL以反映Castagnoli多项式。

目标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;
}
//------------------------------------------------------------------------------------
//crc32c
//计算crc32c(Castagnoli)校验和
//------------------------------------------------------------------------------------
+(uint32_t)crc32c:(NSData*)数据{
/*CRC-32C(iSCSI)多项式的反向位顺序*/
int k;
常量无符号字符*buf=[数据字节];
无符号长len=[数据长度];
uint32_t crc=0xFFFFFFFF;
而(len--){
crc^=*buf++;
对于(k=0;k<8;k++)
//CRC-32C多项式0x1EDC6F41的位顺序相反。
crc=crc&1?(crc>>1)^0x82f63b78:crc>>1;
}
返回~crc;
}

目标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;
}
//------------------------------------------------------------------------------------
//crc32c
//计算crc32c(Castagnoli)校验和
//------------------------------------------------------------------------------------
+(uint32_t)crc32c:(NSData*)数据{
/*CRC-32C(iSCSI)多项式的反向位顺序*/
int k;
常量无符号字符*buf=[数据字节];
无符号长len=[数据长度];
uint32_t crc=0xFFFFFFFF;
而(len--){
crc^=*buf++;
对于(k=0;k<8;k++)
//CRC-32C多项式0x1EDC6F41的位顺序相反。
crc=crc&1?(crc>>1)^0x82f63b78:crc>>1;
}
返回~crc;
}

您可以根据自己的需要调整此选项,谢谢您的建议。实际上,为了让事情顺利进行,我也可以坚持使用boost,在我的缓冲区块上使用process_字节来实现相同的“组合”效果。您可以根据您的需要进行调整谢谢您的建议。实际上,为了让事情顺利进行,我也可以坚持使用boost,在我的缓冲区块上使用process_字节来实现相同的“组合”效果。