我需要为一系列字节计算CRC7
我的多项式x ^ 7 + x ^ 3 + 1
这是我写的一个函数:
unsigned char CRC7(const unsigned char message[], const unsigned int length)
{
const unsigned char poly = 0b10001001;
unsigned char crc = 0;
for (int i = 0; i < length; i++ )
{
crc ^= message[i];
for (int j = 0; j < 8; j++)
crc = crc & 0x1 ? (crc >> 1) ^ poly : crc >> 1;
}
return crc;
}
但它给出了错误的结果。例如,0x82和0x04返回0x57,而它必须是0x61
这个在线计算器适合我:http://www.ghsi.de/pages/subpages/Online%20CRC%20Calculation/
我不能只是从中复制粘贴函数,因为我需要它将值作为unsigned char返回。
我哪里可以犯错?
答案 0 :(得分:1)
要模仿referenced site,请向左移动并仅使用crc
的7位。
以下xor的crc
包含8位消息,但使用poly << 1
,有效地计算了7个最高有效位的CRC。
unsigned char CRC7(const unsigned char message[], const unsigned int length) {
const unsigned char poly = 0b10001001;
unsigned char crc = 0;
for (unsigned i = 0; i < length; i++) {
crc ^= message[i];
for (int j = 0; j < 8; j++) {
// crc = crc & 0x1 ? (crc >> 1) ^ poly : crc >> 1;
crc = (crc & 0x80u) ? ((crc << 1) ^ (poly << 1)) : (crc << 1);
}
}
//return crc;
return crc >> 1;
}
当然const unsigned char poly = 0b10001001;
可以替换
const unsigned char poly = 0b10001001;
const unsigned char poly2 = 0b10001001 << 1;
crc = (crc & 0x80u) ? ((crc << 1) ^ poly2) : (crc << 1);
测试
int main(void) {
printf("%x\n", CRC7((unsigned char*)"\x82\x04",2));
}
输出
61