Vector - CAPL - CRC算法介绍

        当前CAN报文为了车辆的安全性,在重要的报文中回家时E2E校验,而CRC校验则作为一类重要的校验方法,在CRC校验中常见的主要有CalculateCRC8、CalculateCRC8H2F、CalculateCRC16、CalculateCRC32、CalculateCRC32P4、CalculateCRC64,也是我们今天介绍的重点,当前这种校验方法如果使用起来感觉不方便,后续也有文章有CRC校验源码。

        循环冗余校验码((cyclic redundancy check) CRC),简称循环码,是一种常用的、具有检错、纠错能力的校验码,在早期的通信中运用广泛。循环冗余校验码常用于外存储器和计算机同步通信的数据脚丫。奇偶校验码和海明校验码都是采用奇偶检测为手段检错和纠错的(奇偶校验码不具有纠错能力),而循环冗余校验则是通过某种数学运算来建立数据位和校验位的约定关系。

Vector - CAPL - CRC算法介绍_第1张图片

目录

Crc_CalculateCRC8

代码示例

Crc_CalculateCRC16

代码示例

Crc_CalculateCRC32

代码示例


Crc_CalculateCRC8

功能:根据数据计算CRC8的相应校验和。

data:待计算CRC8校验和的数据

dataSize:待计算CRC8校验和的数据长度

dataOffset:用于计算有效载荷数据中的CRC的起始索引。

crcLength:计算CRC的数据长度。

crcStartValue:CRC初始值取决于它是第一次呼叫还是后续呼叫。如果firstCall为1,则忽略值。

firstCall:第一次调用或后续调用的标志。可能的值为0(后续调用)或1(第一次调用)。

ccCalculated:计算的CRC8值

返回值:     

        0:成功计算出CRC8校验和

        -1:CRC长度为0

        -2:偏移大于或等于长度

        -3:长度超出数组范围

        -4:长度和偏移量的摘要超出数组范围

代码示例

// first CALL, Offset '0'
on key 'a'
{
  long retval;
  dword crc;
  byte data[9] = {0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39};

  retval = Crc_CalculateCRC8(data, elcount (data), 0, elcount (data), 0, 1, crc);
  write("CRC of data: 0x%X", crc);
}

// first CALL, Offset '2', Length - 2
on key 'b'
{
  long retval;
  dword crc;
  byte data[11] = {0xAA ,0xAA,0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39};

  retval = Crc_CalculateCRC8(data, elcount (data), 2, elcount (data) -2, 0, 1, crc);
  write("CRC of data: 0x%X", crc);
}

Crc_CalculateCRC16

功能:根据数据计算CRC16的相应校验和。

data:待计算CRC16校验和的数据

dataSize:待计算CRC16校验和的数据长度

dataOffset:用于计算有效载荷数据中的CRC的起始索引。

crcLength:计算CRC的数据长度。

crcStartValue:CRC初始值取决于它是第一次呼叫还是后续呼叫。如果firstCall为1,则忽略值。

firstCall:第一次调用或后续调用的标志。可能的值为0(后续调用)或1(第一次调用)。

ccCalculated:计算的CRC16值

返回值:     

        0:成功计算出CRC16校验和

        -1:CRC长度为0

        -2:偏移大于或等于长度

        -3:长度超出数组范围

        -4:长度和偏移量的摘要超出数组范围

代码示例

// first CALL, Offset '0'
on key 'a'
{
  long retval;
  dword crc;
  byte data[9] = {0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39};

  retval = Crc_CalculateCRC16(data, elcount (data), 0, elcount (data), 0, 1, crc);
  write("CRC of data: 0x%X", crc);
}

// first CALL, Offset '2', Length - 2
on key 'b'
{
  long retval;
  dword crc;
  byte data[11] = {0xAA ,0xAA,0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39};

  retval = Crc_CalculateCRC16(data, elcount (data), 2, elcount (data) -2, 0, 1, crc);
  write("CRC of data: 0x%X", crc);
}

Crc_CalculateCRC32

功能:根据数据计算CRC32的相应校验和。

data:待计算CRC32校验和的数据

dataSize:待计算CRC32校验和的数据长度

dataOffset:用于计算有效载荷数据中的CRC的起始索引。

crcLength:计算CRC的数据长度。

crcStartValue:CRC初始值取决于它是第一次呼叫还是后续呼叫。如果firstCall为1,则忽略值。

firstCall:第一次调用或后续调用的标志。可能的值为0(后续调用)或1(第一次调用)。

ccCalculated:计算的CRC32值

返回值:     

        0:成功计算出CRC32校验和

        -1:CRC长度为0

        -2:偏移大于或等于长度

        -3:长度超出数组范围

        -4:长度和偏移量的摘要超出数组范围

代码示例

// first CALL, Offset '0'
on key 'a'
{
  long retval;
  dword crc;
  byte data[9] = {0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39};

  retval = Crc_CalculateCRC32(data, elcount (data), 0, elcount (data), 0, 1, crc);
  write("CRC of data: 0x%X", crc);
}

// first CALL, Offset '2', Length - 2
on key 'b'
{
  long retval;
  dword crc;
  byte data[11] = {0xAA ,0xAA,0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39};

  retval = Crc_CalculateCRC32(data, elcount (data), 2, elcount (data) -2, 0, 1, crc);
  write("CRC of data: 0x%X", crc);
}

你可能感兴趣的:(CAPL入门到入坑,CAPL,CRC8,CRC16,CRC32,vTESTstudio)