我正在将某些代码从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没有反映。

08-26 03:27