生成整数的4位校验和

时间:2014-02-26 13:36:04

标签: c arduino checksum

我有一个Arduino串行连接,每个传输剩余4位用于校验和。我之前从未做过校验和算法,现在很遗憾。

CRC-4 implementation in C#已经提出了一个问题,但答案并没有真正帮助我前进。

输入应该是一个整数,其中只有10位是重要的。 输出应该是一个字节的4位。

有人可以向我解释我如何调整其他问题的答案或指出另一个方向吗?

byte checksum(int message)
{
   //Check sum algorithm
}

1 个答案:

答案 0 :(得分:1)

其他算法很容易转换为纯C:

uint8_t calculate(byte[] bytes) {
    uint16_t crc = 0xFFFF; // initial value
    // loop, calculating CRC for each byte of the string
    for (uint8_t byteIndex = 0; byteIndex < bytes.Length; ++byteIndex) {
        uint8_t bit = 0x80; // initialize bit currently being tested
        for (uint8_t bitIndex = 0; bitIndex < 8; ++bitIndex) {
            bool xorFlag = ((crc & 0x8000) == 0x8000);
            crc <<= 1;
            if (((bytes[byteIndex] & bit) ^ (uint8_t)0xff) != (uint8_t)0xff)
                crc = crc + 1;
            if (xorFlag)
                crc = crc ^ 0x1021;
            bit >>= 1;
        }
    }
    return (uint8_t)crc;
}

唯一的区别是使用stdint.h类型。

我还将crc的类型更改为正好 16位无符号,并且 索引,仅用于保留一些珍贵的arduino内存(每个字节都很重要) 当你只有2.5k的RAM! :-))

虽然,我没有测试或证明读过那段代码,所以它应该和它一样好 原来的C#one。如果它是错误的,那个也将是。

编辑:正如OP在评论中添加的那样,该资源很好地解释了上述CRC算法的工作原理:http://www.barrgroup.com/Embedded-Systems/How-To/CRC-Calculation-C-Code。 HTH