0

在 C 中提出并回答了一个类似的问题,但我在 C# 中实现同样的目标有点困难。

生成多项式:x^16 + x^10 + x^8 + x^7 + x^3 + 1相当于10000010110001001二进制。


我有 48 位数据,现在我需要生成 16 位 CRC,代码如下:

  private bool[] MakeCRC(string BitString)
    {
        bool[] Res = new bool[17];  
        bool[] CRC = new bool[16];
        int i;
        bool DoInvert= false;

        for (i = 0; i < 16; ++i) // Init before calculation
            CRC[i] = false;

        for (i = 0; i < BitString.Length; ++i)
        {
            if (BitString[i] == '1')
                DoInvert = true ^ CRC[15];

            //DoInvert = ('1' == BitString[i]) ^ CRC[15]; // XOR required?

            CRC[15] = CRC[14];
            CRC[14] = CRC[13];
            CRC[13] = CRC[12];
            CRC[12] = CRC[11];
            CRC[11] = CRC[10];
            CRC[10] = CRC[9] ^ DoInvert;
            CRC[9] = CRC[8];
            CRC[8] = CRC[7] ^ DoInvert;
            CRC[7] = CRC[6] ^ DoInvert;
            CRC[6] = CRC[5];
            CRC[5] = CRC[4];
            CRC[4] = CRC[3];
            CRC[3] = CRC[2] ^ DoInvert;
            CRC[2] = CRC[1];
            CRC[1] = CRC[0];
            CRC[0] = DoInvert;
        }

        for (i = 0; i < 16; ++i)
            Res[15 - i] = CRC[i] ? true : false;

        Res[16] = false; // Set string terminator

        return (Res);

    }

但是上面的代码给了我错误的输出,如果有更好的方法,请建议我。

Edit:

数据(a0 到 a47):100011100011000001000001000100001000000000001000

多项式:10000010110001001

获得的输出:0011 0100 1111 0111

预期输出:1100 1101 0100 1111


谢谢你的时间。!

4

1 回答 1

3

取消注释 DoInvert = ('1' == BitString[i]) ^ CRC[15]; 并删除上面的行,它可以工作。

您对注释行的替换是错误的。正确的是:

if (BitString[i] == '1')
    DoInvert = true ^ CRC[15];
else
    DoInvert = false ^ CRC[15];
于 2013-09-11T14:52:35.547 回答