计算 CRC16/MCRF4XX 的问题

Issues with calculating CRC16/MCRF4XX

我需要一些帮助,因为我似乎无法计算单个字节的 CRC,更不用说字节数组了。

下面是我一直在努力工作的测试代码。请注意,我使用了 中的代码,并且带有字符数组的示例有效,但我需要能够对其进行调整以使其适用于 uint8_t.

的数组

在了解 CRC 的基础知识时,这似乎应该可行,但我可能弄错了。

我一直在尝试通过使用此 site.

检查输出的余数 (crc) 来验证函数

如果有人可以确定导致计算错误 CRC 值的问题出在哪里,并告诉我为什么会发生这种情况,我们将不胜感激!

#include <cstdint>
#include <iostream>

// Below 2 functions take from 
// 

int16_t Utils_CRC16_MCRF4XX( uint16_t Crc, uint8_t Byte )
{
    Crc ^= Byte ;

    for( uint8_t i = 0; i < 8; i++ )
    {
        Crc = (Crc & 0x0001) != 0 ? (Crc >> 1) ^ 0x8408 : 
                                    Crc >> 1 ;
    }

    return Crc ;
}

uint16_t crc( uint8_t* pData, uint32_t Len )
{
    uint16_t Crc = 0xffff;

    for( uint32_t i = 0; i < Len; i++ )
    {
        Crc = Utils_CRC16_MCRF4XX( Crc, pData[i] );
    }
    return (Crc);
}

int main()
{
    int8_t val1 = 30;
    int8_t val2 = 30;

    // Arbitrary Test Message
    uint8_t message[] = 
    {
        (uint8_t)54
    };

    /*
    // Sample Test Message (Actually what I intend to transmit)
    uint8_t message[] = 
    {
        (uint8_t)250,
        (uint8_t)7,
        (uint8_t)21,
        (uint8_t)2,
        (uint8_t)2,
        (uint8_t)val1,
        (uint8_t)val2
    };
    */

    //uint8_t test[] = "123456789";

    uint16_t remainder = crc(message, sizeof(message));
    // Expected DEC: 28561
    // Actual DEC: 23346

    std::cout << "CRC: " << remainder << std::endl;

    return 0;
}

如果你这样做:

    uint8_t test[] = "123456789";

    uint16_t remainder = crc(test, sizeof(test)-1);

然后你得到了预期的结果,28561。

您需要从 sizeof(test) 中减去 1 以排除终止的 0。