C# C中DECT的CRC 16#

C# C中DECT的CRC 16#,c#,crc16,C#,Crc16,在C语言中有一个“问”和“答”,但我在C语言中努力实现同样的目标 生成器多项式:x^16+x^10+x^8+x^7+x^3+1相当于二进制的100000110001 我有48位数据,现在我需要生成16位CRC,代码如下: private bool[] MakeCRC(string BitString) { bool[] Res = new bool[17]; bool[] CRC = new bool[16]; int i;

在C语言中有一个“问”和“答”,但我在C语言中努力实现同样的目标

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


我有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);

    }
private bool[]MakeCRC(字符串位字符串)
{
bool[]Res=新bool[17];
bool[]CRC=新bool[16];
int i;
bool DoInvert=false;
对于(i=0;i<16;++i)//Init,计算前
CRC[i]=假;
对于(i=0;i
但是上面的代码,给了我错误的输出,如果有更好的方法,请建议我

编辑:

数据(a0至a47):
1000111000110000000100001000100001000000001000

多项式:
100000011000001

获得的输出:
0011010111

预期输出:1100 1101 0100 1111


谢谢你的时间

取消注释DoInvert=('1'==位字符串[i])^CRC[15]; 然后拆下上面的线路,它就可以工作了

替换注释行是错误的。正确的做法是:

if (BitString[i] == '1')
    DoInvert = true ^ CRC[15];
else
    DoInvert = false ^ CRC[15];
取消注释DoInvert=('1'==位字符串[i])^CRC[15]; 然后拆下上面的线路,它就可以工作了

替换注释行是错误的。正确的做法是:

if (BitString[i] == '1')
    DoInvert = true ^ CRC[15];
else
    DoInvert = false ^ CRC[15];

“给我错误的输出”并不是问题的充分解释。根据您的测试,哪些部件可以正常工作,哪些部件不能正常工作,请提供一些示例输入、实际输出和预期输出。最后,C解决方案应该非常接近于C代码,只需要很少的更改。为什么你不决定更紧密地映射你链接到的工作解决方案之一,而不是做一些完全不同的事情?@Servy,谢谢你的建议,请参阅编辑部分,我仍然使用相同的方法,但由于指针不同的数据类型。“给我错误的输出”这并不是对问题的充分解释。根据您的测试,哪些部件可以正常工作,哪些部件不能正常工作,请提供一些示例输入、实际输出和预期输出。最后,C解决方案应该非常接近于C代码,只需要很少的更改。为什么你不决定更紧密地映射你链接到的工作解决方案之一,而不是做一些完全不同的事情?@Servy,谢谢你的建议,请参阅编辑部分,我仍然使用相同的方法,但由于指针的原因,数据类型不同。