crc16.h
#define CRC16_POLY           0x8005
#define CRC_INIT      0x0
unsigned short GenCRC16(char *p, int n);crc16.cpp
unsigned short GenCRC16(char *p, int n)
{
int i,j;
char Data;

unsigned short checksum = CRC_INIT;   

for(i = 0; i < n; i++){
Data = *p++;
for (j = 0; j < 8; j++) {
  if (((checksum & 0x8000) >> 8) ^ (Data & 0x80))
  checksum= (checksum << 1) ^ CRC16_POLY;
  else
  checksum = (checksum << 1);

  Data <<= 1;
  }
} return checksum;
}

解决方案 »

  1.   

    ushort GenCRC16(byte[] p)
    {
    int i,j;
    byte Data;ushort checksum = CRC_INIT; for(i = 0; i < p.Length; i++){
    Data = p[i];
    for (j = 0; j < 8; j++) {
      if (((checksum & 0x8000) >> 8) ^ (Data & 0x80))
      checksum= (checksum < < 1) ^ CRC16_POLY;
      else
      checksum = (checksum < < 1);  Data < <= 1;
      }
    }return checksum;
    } 未经编译
      

  2.   


    ushort GenCRC16(char[] p, int n)
            {
                int i, j;
                char Data;            ushort checksum = CRC_INIT;            for (i = 0; i < n; i++)
                {
                    Data = *p++;
                    for (j = 0; j < 8; j++)
                    {
                        if (((checksum & 0x8000) >> 8) ^ (Data & 0x80))
                            checksum = (checksum << 1) ^ CRC16_POLY;
                        else
                            checksum = (checksum << 1);                    Data <<= 1;
                    }
                }            return checksum;
            } 
      

  3.   

    这个方式我昨天就已经试过了,编译是不通过的, 后来我进行了修改, 代码如下:public ushort GenCRC16(byte[] p)
    {
        int i, j;
        byte Data;
        ushort checksum = CRC_INIT;
        for (i = 0; i < p.Length; i++)
        {
            Data = p[i];
            for (j = 0; j < 8; j++)
            {
                if (((checksum & 0x8000) >> 8) != (Data & 0x80))
                    checksum = (ushort)((checksum << 1) ^ CRC16_POLY);
                else
                    checksum = (ushort)(checksum << 1);            Data = (byte)(Data << 1);
            }
        }
        return checksum;
    }修改成这样之后编译是能成功的,但是得出的校验码与C++里面得出的校验码不同; 谢谢
      

  4.   


    wuyazhe, 谢谢你的回复, Data = *p++; 这句在C#是不能通过编译的, C# 不能执行这句(将当前指针的值赋值给Data,并指向下一个指针);if (((checksum & 0x8000) >> 8) ^ (Data & 0x80)) 这句返回的是int型, 不是C++里面的bool;谢谢
      

  5.   

    public static ushort CRC16_POLY = 0x8005;
            public static ushort CRC_INIT = 0x0;
            public ushort GenCRC16(byte[] p)
            {
                int i, j;
                byte Data;            ushort checksum = CRC_INIT;            for (i = 0; i < p.Length; i++)
                {
                    Data = p[i];
                    for (j = 0; j < 8; j++)
                    {
                        if ((((checksum & 0x8000) >> 8) ^ (Data & 0x80)) != 0)
                            checksum = (ushort)((checksum << 1) ^ CRC16_POLY);
                        else
                            checksum = (ushort)(checksum << 1);                    Data <<= 1;
                    }
                }            return checksum;
            }
            private void button2_Click(object sender, EventArgs e)
            {
                byte[] b = new byte[] { 1, 2, 3 };
                ushort r = GenCRC16(b);
                textBox5.Text = r.ToString();
            }
      

  6.   


    谢谢 soaringbird 的回复, 这个校验结果依然和C++的校验结果不一致;
      

  7.   

    我操作的是这样一个字串;
    See the comments at the top of Terminal.cs for information.在C#里先把这个字串给转成16进制, 然后再转成byte[];最后传入GenCRC16(byte[] p),得出结果2550; C++里面得出结果:0x2B0C; 十进制:11020
      

  8.   

    哦? 这样啊? 那我再看看, 谢谢你了soaringbird; 待会我来散分再次感谢你的帮助(soaringbird)
      

  9.   


    char*p1="See the comments at the top of Terminal.cs for information.";
    unsigned short rr= GenCRC16(p1,59);
    printf("%d\n",rr);
      

  10.   

    哦, 问题解决了, 谢谢(soaringbird), C++里面重新定义了一次CRC16_POLY的值,才导致两边得出的结果不一致的!  谢谢你了!!!