循环冗余校验计算C到C#代码转换不起作用 unsigned short calculaterc(字符*缓冲区,整数大小) { 无符号短cword=0; 无符号短ch; int i,j; 对于(i=0;i

循环冗余校验计算C到C#代码转换不起作用 unsigned short calculaterc(字符*缓冲区,整数大小) { 无符号短cword=0; 无符号短ch; int i,j; 对于(i=0;i,c#,C#,试试这个: public static int CalculateCheckSum(byte[] strsResponse) { short crc = 0; try { short ch; for (int i = 0; i < strsResponse.Length; i++) { ch = (short)(strsResponse[i] << 8); f

试试这个:

public static int CalculateCheckSum(byte[] strsResponse)
{
    short crc = 0;
    try
    {
        short ch;
        for (int i = 0; i < strsResponse.Length; i++)
        {
            ch = (short)(strsResponse[i] << 8);
            for (int j = 0; j < 8; j++)
            {
                bool xorFlag = (ch & 0x8000)==1?false:true;
                if (xorFlag)
                {
                    crc = (short)((crc <<= 1) ^ 4129);
                }
                else
                {
                    crc <<= 1;
                }
                ch <<= 1;
            }
        }
    }
    catch (Exception ex)
    {
        return crc = 0;
    }
    return crc;
}
publicstaticintcalculatechecksum(字节[]strssresponse)
{
短crc=0;
尝试
{
乌舒特;
for(int i=0;ich=(ushort)(strssresponse[i]而不是开始广泛讨论“不工作”的含义(任何编译错误、运行时错误、意外行为等),也许你应该为C#寻找一个现有的CRC实现。我无法想象以前没有人用C#写过这个。事实上,我认为它已经存在于.NET中。@GolezTrol除非它隐藏在某个意想不到的地方,奇怪的是它似乎不在.NET中。首先,
short!=无符号short
,这些符号位确实使CE
public static int CalculateCheckSum(byte[] strsResponse)
{
    short crc = 0;
    try
    {
        short ch;
        for (int i = 0; i < strsResponse.Length; i++)
        {
            ch = (short)(strsResponse[i] << 8);
            for (int j = 0; j < 8; j++)
            {
                bool xorFlag = (ch & 0x8000)==1?false:true;
                if (xorFlag)
                {
                    crc = (short)((crc <<= 1) ^ 4129);
                }
                else
                {
                    crc <<= 1;
                }
                ch <<= 1;
            }
        }
    }
    catch (Exception ex)
    {
        return crc = 0;
    }
    return crc;
}
public static int CalculateCheckSum(byte[] strsResponse)
{
    short crc = 0;
    try
    {
        ushort ch;
        for (int i = 0; i < strsResponse.Length; i++)
        {
                ch = (ushort)(strsResponse[i] << 8);
                for (int j = 0; j < 8; j++)
                {
                    bool xorFlag = ((ch & 0x8000) ^ (cword & 0x8000)) == 0 ? false : true;
                    if (xorFlag)
                    {
                        crc = (ushort)((crc <<= 1) ^ 4129);
                    }
                    else
                    {
                        crc <<= 1;
                    }
                    ch <<= 1;
                }
        }
    }
    catch (Exception ex)
    {
        return crc = 0;
    }
    return crc;
}