代码(用C编写):
unsigned long chksum_crc32 (unsigned char *block, unsigned int length)
{
register unsigned long crc;
unsigned long i;
crc = 0xFFFFFFFF;
for (i = 0; i < length; i++)
{
crc = ((crc >> 8) & 0x00FFFFFF) ^ crc_tab[(crc ^ *block++) & 0xFF];
}
return (crc ^ 0xFFFFFFFF);
}
/* chksum_crc32gentab() -- to a global crc_tab[256], this one will
* calculate the crcTable for crc32-checksums.
* it is generated to the polynom [..]
*/
void chksum_crc32gentab ()
{
unsigned long crc, poly;
int i, j;
poly = 0xEDB88320L;
for (i = 0; i < 256; i++)
{
crc = i;
for (j = 8; j > 0; j--)
{
if (crc & 1)
{
crc = (crc >> 1) ^ poly;
}
else
{
crc >>= 1;
}
}
crc_tab[i] = crc;
}
}
对于初学者; 我知道 CRC 是如何工作的,首先使用指定的多项式计算除数,然后将此 FCS(帧校验序列)附加到数据集并发送到最终用户系统。传输完成后,使用用于计算 FCS 的相同多项式检查 FCS,如果具有该除数的数据的余数为零,则您知道数据是正确的。
我不明白这两个功能的实现。据我所知,函数 chksum_crc32gentab() 生成校验和可以采用 32 位 CRC 多项式的所有可能的十六进制值。我不明白的一件事是poly = 0xEDB88320L; 等价于多项式。我也不明白这个函数底部的逻辑。例如,条件if (crc & 1),这是否意味着对于 crc 中为 1 的每一位,计算,否则右移一位?
我也不明白chksum_crc32(unsigned char *block, unsigned int length); . 这个函数是否只接收一串字节并将它们转换为使用表计算的正确 crc 值?我想我对它在 for 循环中使用的逻辑感到困惑。
如果有人理解这段代码,解释会很好;这确实适用于 .net 类的 crc32 转换,如何转换数据然后由这些函数使用的示例如下:(C# 源代码)
MemoryStream ms = new MemoryStream(System.Text.Encoding.Default.GetBytes(input));
foreach (byte b in crc32.ComputeHash(ms))
hash += b.ToString("x2").ToLower();
这是 C 代码的原始站点和项目。http://www.codeproject.com/Articles/35134/How-to-calculate-CRC-in-C
任何解释都会有所帮助