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

CCITT CRC 16位起始值0xFFFF

秦涵映
2023-03-14
CHAR_t TestStr[] = {"123456789"};
unsigned short CrcTest = calculate_CRC16(TestStr,sizeof(TestStr)-1);
QString CrcDisplay = QString("CrcTest : %1").arg(CrcTest);
ui->txtDebug->setText(CrcDisplay);

这是calculate_CRC16函数:

UINT16_t MainWindow::calculate_CRC16(CHAR_t* pData, UINT16_t wLength)
{

  UCHAR_t i;
  UINT16_t wData;
  UINT16_t wCrc = 0xffff;

  if (wLength == 0)
    return (~wCrc);

  do
  {
    for (i=0, wData=(unsigned int)0xff & *pData++; i < 8; i++, wData >>= 1)
    {
        if ((wCrc & 0x0001) ^ (wData & 0x0001))
            wCrc = (wCrc >> 1) ^ CRC_POLY;
        else  wCrc >>= 1;
    }
  } while (--wLength);

  wCrc = ~wCrc;
  wData = wCrc;
  wCrc = (wCrc << 8) | (wData >> 8 & 0xff);

  return (wCrc);
}

共有1个答案

谭昊乾
2023-03-14

0x29b1的结果是“false”CCITT CRC-16(链接到CRC目录)。显然是你需要的。从目录中:

width=16 poly=0x1021 init=0xffff refin=false refout=false xorout=0x0000 check=0x29b1 name="CRC-16/CCITT-FALSE"

因此没有位反转(refinrefoutfalse)。CRC是用0xffff初始化的,不进行后处理。

以最少的更改修复代码:

if (wLength == 0)
    return wCrc;

do
{
    for (i=0, wData=((unsigned int)0xff & *pData++) << 8; i < 8; i++, wData <<= 1)
    {

        if ((wCrc & 0x8000) ^ (wData & 0x8000))
            wCrc = (wCrc << 1) ^ 0x1021;
        else  wCrc <<= 1;
    }
} while (--wLength);

return wCrc & 0xffff;
while (wLength--) {
    wCrc ^= *(unsigned char *)pData++ << 8;
    for (i=0; i < 8; i++)
        wCrc = wCrc & 0x8000 ? (wCrc << 1) ^ 0x1021 : wCrc << 1;
}
return wCrc & 0xffff;
 类似资料:
  • 默认情况下,背景图像从元素的 padding 区域的左上角开始显示。然而,有时候却希望背景图像从边框的左上角、或内容区的左上角开始显示。 这时,就可以通过 background-origin属性来设置背景图像的起始显示位置,可选值有 border-box | padding-box | content-box,默认值为 padding-box。 border-box 表示背景图像从 border

  • 问题内容: 在产品页面上,我有一个下拉列表,列出了与产品页面关联的当前颜色选项。 在此示例中,产品页面SKU为250E,可在以下位置使用: 如果客户选择GREEN,则我想运行一个MySQL命令,该命令将根据下面显示的custom_order值将数据更改为首先显示GREEN值。 起始值应覆盖其他数据项,然后应保留custom_order值。custom_order字段的字母类似c1,c2(它们将始终

  • 问题内容: 我以前从未在Java中使用过位,所以问题如下: 如何从msb位置开始从该字节中获取位? 先感谢您 问题答案:

  • 问题内容: 如何使用注释设置自动递增ID的起始值? 我希望它从250000开始 问题答案: /* * @ORM\Id * @ORM\GeneratedValue(strategy=”SEQUENCE”) * @ORM\SequenceGenerator(sequenceName=”id”, initialValue=250000) * @ORM\Column(type=”integer”) / p

  • 这是我的选择代码: 如何为这个设置一个标准的begin值我想我必须设置这个变量: 如您所见,当我设置值时,select框为空,对于第二个选择,我给出了的值,选择框也是空的: 我想将每个选择框的begin值设置为静态

  • 我正在使用jsPlumb开发一个应用程序。目前,如果我创建一个形状,它会将该形状放在画布的左上角。如果我从源点连接到目标点,它就工作了。 现在,我想在右键单击并从源连接到目标的位置创建形状。我能够在右键单击的位置创建形状。 但是,如果我从一个源拖动到另一个目标,源锚点就不是从源开始的。相反,它从左上角开始。在下面的屏幕截图中,我想从“项目”拖到“无状态”形状。 还有一件事是,如果我拖动“项目”形状