1

我正在创建 CRC-CCITT 编码(Polynomail 0x1021 和初始值为 0xFFFF)它是正确的 8 位、16 位、24 位、32 位......(1 字节、2 字节、3 字节......)但不正确的答案是 12 位、20 位、28 位(不是字节)

I find this algorithm

function crc(bit array bitString[1..len], int polynomial) {
    shiftRegister := initial value //  00000000 OR 11111111
    for i from 1 to len {
        if (shiftRegister top bit) xor bitString[i] = 1
            shiftRegister := (shiftRegister left shift 1) xor polynomial
        else
            shiftRegister := shiftRegister left shift 1
    }
    return shiftRegister
}

我的源代码就是这样

    // crc_ccitt.h
    #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    #include <string.h>

    static const char CRC_CCITT[] = "0001000000100001";
    static char Shift_Register[] = "1111111111111111";

    char* getCRC(char *, int);
    void leftShift(char *);
    void xorCalc();

    char* getCRC(char* dataCode, int dataCodeLength) {
      int i;

      for (i = 0; i < dataCodeLength; i++) {
        if ((Shift_Register[0] == '1' && dataCode[i] == '0') 
          || (Shift_Register[0] == '0' && dataCode[i] == '1')) {
            leftShift(Shift_Register);
            xorCalc();
        } else {
          leftShift(Shift_Register);
        }
        printf("%c%c%c%c ", Shift_Register[0], Shift_Register[1], Shift_Register[2],         Shift_Register[3]);
        printf("%c%c%c%c ", Shift_Register[4], Shift_Register[5], Shift_Register[6], Shift_Register[7]);
        printf("%c%c%c%c ", Shift_Register[8], Shift_Register[9], Shift_Register[10], Shift_Register[11]);
        printf("%c%c%c%c ", Shift_Register[12], Shift_Register[13], Shift_Register[14], Shift_Register[15]);
        printf("\n");
      }

      return Shift_Register;
    }

    void leftShift(char *Shift_Register) {
      memmove(Shift_Register, Shift_Register + 1, strlen(Shift_Register) - 1);
      memset(Shift_Register + strlen(Shift_Register) - 1, '0', 1);
    }


    void xorCalc() {
      int i;

      for (i = 0; i < 16; ++i) {
        if ((Shift_Register[i] == '1' && CRC_CCITT[i] == '0')
          || (Shift_Register[i] == '0' && CRC_CCITT[i] == '1')) {
            Shift_Register[i] = '1';
        } else {
          Shift_Register[i] = '0';
        }
      }
    }

    // crc_ccitt.c
    #include "crc_ccitt.h"

    int main() {
      char dataCode[256];
      char *CRC = "";
      printf("Input Data Code: ");
      gets(dataCode);

      /*
      puts(dataCode);
      rightShift(dataCode);
      puts(dataCode);
      */

      CRC = getCRC(dataCode, strlen(dataCode));
      //printf("%s", CRC);
      return 0;
    }

我通过此页面确认 CRC 编码值 http://www.lammertbies.nl/comm/info/crc-calculation.html

例如

输入 0001111111110010(1FF2)

页码:C11F

我的程序:1100 0001 0001 1111 (C11F)

输入 000111111111 (1FF)

页面:FFAD

我的程序:1101 0011 0000 1111 (D30F)

缺少我的程序怎么办?

或者,算法错了吗??

4

1 回答 1

0

程序 OK
算法 OK
用户输入可能是错误。

您的 CRC "0001000000100001" 用于 16 位操作。
您失败的输入是“000111111111”,12 位。而是尝试使用“0000000111111111”或“0001111111110000”(左侧或右侧的垫)

注意:我自己会尝试过,但您没有提供 crc_ccitt.h

于 2013-05-24T14:02:42.277 回答