3

12 ビット CRC とアルゴリズムに対して crc_table を実行しようとしていますが、常に間違った結果が得られます。

手伝って頂けますか?crcテーブルを作成するには、次を試します:

void crcInit(void)
{
    unsigned short  remainder;
    int    dividend;
    unsigned char  bit;

    for (dividend = 0; dividend < 256; ++dividend)
    {
        remainder = dividend << 4;

        for (bit = 8; bit > 0; --bit)
        {
            if (remainder & 0x800)
            {
                remainder = (remainder << 1) ^ 0x180D; //Polynomio of CRC-12
            }
            else
            {
                remainder = (remainder << 1);
            }
        }
       crcTable[dividend] = remainder;
    }

}

私はそれを更新しました.CRCアルゴリズムは次のとおりです。

unsigned short crcFast(unsigned char const message[], int nBytes)
{
    unsigned short remainder = 0x0000;
    unsigned char  data;
    int  byte;


    /*
     * Divide the message by the polynomial, a byte at a time.
     */
    for (byte = 0; byte < nBytes; ++byte)
    {
        data = message[byte] ^ (remainder >> 4);
    remainder = crcTable[data] ^ (remainder << 8);
    }

    /*
     * The final remainder is the CRC.
     */
    return (remainder ^ 0);

}

しかし、それは機能していません.....

4

2 に答える 2

3

これは正しくないようです:

if (remainder & 10000000)

この数値を2進数にするつもりのようですが、実際には10進数です。代わりに16進リテラル(0x80)を使用する必要があります。

この数と、実行するシフトのサイズにも問題があるようです。このテストでは、余りの上位ビットが設定されているかどうかを確認する必要があります。12ビットCRCを実行しているため、マスクは0x800(バイナリ100000000000)である必要があります。そして、その上のシフトはおそらく次のようになります。

remainder = dividend << 4;

余りの左端の8ビットを設定します。

于 2012-09-28T00:48:05.000 に答える