如何使用 zlib 计算 CRC32-C 校验和
How to calculate CRC32-C checksum with zlib
我正在使用 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 做到这一点?
zlib 是开源的。您可以简单地获取源代码并根据自己的需要进行修改。您可以将行:odd[0] = 0xedb88320UL;
更改为 Castagnoli 多项式的反射。
对于Objective 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;
}
我正在使用 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 做到这一点?
zlib 是开源的。您可以简单地获取源代码并根据自己的需要进行修改。您可以将行:odd[0] = 0xedb88320UL;
更改为 Castagnoli 多项式的反射。
对于Objective 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;
}