如何使用此CRC-32C C#库?

问题描述

我已经为我正在处理的项目下载了该库https://github.com/robertvazan/crc32c.net。我需要在项目的一部分中使用CRC,所以我下载了该库,因为它显然比我在不久的将来要写的东西要快得多。

我对crc的工作方式有一些了解,我曾经做过一个软件实现(作为学习的一部分),但是我必须在尝试使该库正常工作时做一些非常愚蠢的事情,而不是意识到。无论我做什么,即使数组没有更改,我似乎也无法获得crc = 0。

基本上,我的问题是,我实际上如何使用该库来检查字节数组的完整性?

按照我的理解,我应该第一次调用Crc32CAlgorithm.Compute(array)来计算crc,然后在附加了先前返回值的数组上再次调用它(我也尝试将其附加将数组的最后4个字节设置为零,然后再将返回值放到那里,如果第二次调用返回0,则数组不变。

请帮助我,我不知道我在做什么错。

编辑:当我这样做时,它是不正确的:(是的,我知道linq非常慢,这只是一个例子)

        using(var hash = new Crc32CAlgorithm())
        {
            var array = new byte[] { 1,2,3,4,5,6,7,8 };
            var crc = hash.ComputeHash(array);
            var arrayWithCrc = array.Concat(crc).ToArray();
            Console.WriteLine(string.Join(" ",hash.ComputeHash(arrayWithCrc)));
        }

控制台输出:199 75 103 72

解决方法

您无需在消息中附加CRC并计算该消息的CRC即可检查CRC。只需在一端计算消息的CRC,将其与消息一起发送,在另一端计算 just 消息的CRC(不包括发送的CRC),然后比较您计算出的与消息一起发送的CRC。

它们应该彼此相等。这里的所有都是它的。这适用于您可能使用的任何哈希,而不仅仅是CRC。

如果您深深地被迫利用CRC的可爱数学特性,即在附加了CRC的消息上计算CRC可以得出特定的结果,则可以。您必须以正确的顺序附加CRC位,并且需要查找CRC的“残差”,该残差可能不为零。

在您的情况下,实际上您是以正确的顺序附加位的(通过以little-endian顺序附加字节的),并且得到的结果是CRC-32C的正确残差。该残差为0x48674bc7,您的199 75 103 72以小尾数顺序分成字节,然后转换为十进制。

您会发现,如果采用 any 个字节序列,则计算该字节的CRC-32C,然后以little-endian顺序将该CR​​C附加到序列中,然后计算该字节的CRC-32C。序列加上CRC,您将总是获得0x48674bc7

但是,这比仅比较两个CRC还要慢,因为现在您必须比以前多四个字节来计算CRC。因此,实际上,不需要这样做。