当前位置: 首页 > 知识库问答 >
问题:

如何使用这个CCITT-CRC16函数?

严嘉良
2023-03-14

在这里,有一个CCITT-CRC16的实现。对于那些避免链接,它是用C写的,如下所示:

unsigned short crc16(data_p, length)
char *data_p;
unsigned short length;
{
       unsigned char i;
       unsigned int data;
       unsigned int crc;

       crc = 0xffff;

       if (length == 0)
              return (~crc);

       do {
              for (i = 0 data = (unsigned int)0xff & *data_p++;
                  i < 8;
                  i++, data >>= 1) {
                    if ((crc & 0x0001) ^ (data & 0x0001))
                           crc = (crc >> 1) ^ POLY;
                    else
                           crc >>= 1;
              }
       } while (--length);

       crc = ~crc;

       data = crc;
       crc = (crc << 8) | (data >> 8 & 0xFF);

       return (crc);
}

我需要在CCITT-CRC16实现中找到的两个字段:data_plength,所以我的问题是······用于更新CRC的整数值是什么意思?在我翻译的代码中,程序执行crc.put(someChar)很多次,然后在再次调用crc.put(someChar)之前更改someChar,并且执行多次。假设我将所有这些somechars逐一保存到一个名为somechars的数组中。

所有这些字符产生的CRC是否会通过CRC16(someChars,sizeof(someChars)/sizeof(someChars[0]))...调用?

另外,我必须为数组使用UINT8_T类型吗?

我没有例子可以参考,所以我在这里要求确保这是100%正确的。

共有1个答案

慕容坚
2023-03-14

有许多可供选择的算法来计算这个CRC:一些使用查找表,一些使用位操作,一些翻转一些位,一些翻转一些其他位...

您提到的crcname.put(int byte)函数很可能是对正在计算的CRC的更新。也就是说,它计算内部do/while循环的一次迭代,使用传递的字节(实际上是unsigned char而不是int)作为data局部变量的值。

在未知的crcname类型中,可能有一个成员变量存储crc变量,一个构造函数将其设置为intitial值,还有一个int crcname.getfinalcrcvalue()进行最后的计算。

无论如何,如果您没有任何示例来比较您的输出,那么您不太可能得到正确的结果。太多会出错的事情。

关于UINT8_T类型,这并不重要,除非您的char_bits值与8不同,如果是这种情况,您就有更大的问题了!

 类似资料:
  • 这是代码 更新的答案

  • 我试过用 如何在php中计算crc16 CRC16函数的C到PHP转换 我在寻找校验和

  • 当RFID阅读器处于自动模式时,它每读取一个标签就自动发送11个字节。CRC-此值使用除最后两个字节外的所有字节计算,这两个字节是CRCH(CRC高字节)和CRCL(CRC低字节)。 当我从阅读器读取RFID标签时,我得到了11个字节的传输...即(十六进制)<代码>01 0B 03 01 06 87分贝C7 FF E5 68。最后两个字节是消息的CRC16校验和。为了确认数据是否正确,我需要在目

  • 他们使用术语截断多项式来表示:。他们使用什么模式将此扩展到此?

  • 我有一个扩展类,在这里我扩展了,如下所示,它工作得很好。 但是现在,我需要为某个视图控制器更改它的标题,所以我想过它的重写,但是失败了。如何可以重写它,以便我可以更改它的?

  • 这是我的actionCreator代码,crud所有的代码都一样,只需要改一个 “getMovies" 这个名字,所以我想要把这个函数封装一下,每次只需要传入一个函数名字就行了。求大佬给封装一下?? 感谢