我正在将某些代码从OSX上的C移植到使用Commonccrypto和kCN_CRC_64_ECMA_182
CRC64实现的C#。例如,使用CommonCrypto,将使用以下公式计算CRC:CNCRC(kCN_CRC_64_ECMA_182, bytes, bytesLen, &crcResult)
这将输出正确的值。当使用C#库HashLib(或任何其他代码)时,输出完全不同,例如,与上述使用HashLib的等效项是:var checksum = HashFactory.Checksum.CreateCRC64(0x42F0E1EBA9EA3693UL); // ECMA 182 var result = checksum.ComputeBytes(bytes);
有任何想法吗?就输出而言,C#中是否有一个等效于Apple CommonCrypto的实现?
最佳答案
这是一些简单的C代码来计算ECMA-182 CRC:
#include <stddef.h>
#include <stdint.h>
#define POLY UINT64_C(0x42f0e1eba9ea3693)
#define TOP UINT64_C(0x8000000000000000)
/* Return crc updated with buf[0..len-1]. If buf is NULL, return the initial
crc. So, initialize with crc = crc64_ecma182(0, NULL, 0); and follow with
one or more applications of crc = crc64_ecma182(crc, buf, len); */
int64_t crc64_ecma182(int64_t crc, unsigned char *buf, size_t len)
{
int k;
if (buf == NULL)
return 0;
while (len--) {
crc ^= (uint64_t)(*buf++) << 56;
for (k = 0; k < 8; k++)
crc = crc & TOP ? (crc << 1) ^ POLY : crc << 1;
}
return crc;
}
我认为,根据what I found on github判断,HashLib完全是错误的。它所做的是CRC反映,而ECMA-182中定义的CRC64没有反映。