CRC 校驗,生成多項式:
X7+X6+X5+X2+1。怎么寫CRC校驗演算法,資料B0 99 41 81 02 00 02 生成校驗碼
uj5u.com熱心網友回復:
僅供參考:/***** crc16.c *****/
#include <stdio.h>
#define CRC16_DNP 0x3D65u // DNP, IEC 870, M-BUS, wM-BUS, ...
#define CRC16_CCITT 0x1021u // X.25, V.41, HDLC FCS, Bluetooth, ...
//Other polynoms not tested
#define CRC16_IBM 0x8005u // ModBus, USB, Bisync, CRC-16, CRC-16-ANSI, ...
#define CRC16_T10_DIF 0x8BB7u // SCSI DIF
#define CRC16_DECT 0x0589u // Cordeless Telephones
#define CRC16_ARINC 0xA02Bu // ACARS Aplications
#define POLYNOM CRC16_DNP // Define the used polynom from one of the aboves
// Calculates the new crc16 with the newByte. Variable crcValue is the actual or initial value (0).
unsigned short crc16(unsigned short crcValue, unsigned char newByte) {
int i;
for (i = 0; i < 8; i++) {
if (((crcValue & 0x8000u) >> 8) ^ (newByte & 0x80u)){
crcValue = (crcValue << 1) ^ POLYNOM;
} else {
crcValue = (crcValue << 1);
}
newByte <<= 1;
}
return crcValue;
}
unsigned short exampleOfUseCRC16(unsigned char *Data, int len){
unsigned short crc;
int aux = 0;
crc = 0x0000u; //Initialization of crc to 0x0000 for DNP
//crc = 0xFFFFu; //Initialization of crc to 0xFFFF for CCITT
while (aux < len){
crc = crc16(crc,Data[aux]);
aux++;
}
return (~crc); //The crc value for DNP it is obtained by NOT operation
//return crc; //The crc value for CCITT
}
int main() {
unsigned char d[10]={0,1,2,3,4,5,6,7,8,9};
printf("0x%04hX\n",exampleOfUseCRC16(d,10));//0x1078
return 0;
}
uj5u.com熱心網友回復:
https://wenku.baidu.com/view/4dde6302cc1755270722082d.htmluj5u.com熱心網友回復:
void CKysoftver2App::ToCRC(BYTE szBuffer[8]){
BYTE d;
UINT uj,uk,CRC;
CRC=0x0000FFFF;
for (uj=0; uj<6; uj++)
{
CRC=CRC^szBuffer[uj];
for (uk=0; uk<8; uk++)
{
d=CRC & 0x00000001;
CRC=CRC>>1;
if (d!=0) CRC=CRC^0x0000A001;
}
}
d=CRC & 0x000000FF; szBuffer[6]=d;
d=(CRC>>8) & 0x000000FF; szBuffer[7]=d; //生成CRC校驗
}
uj5u.com熱心網友回復:
//CRC8 多項式為 X8+X2+X1+1 = 1 00000111 = 0x07 ;use "<<" rev= 11100000 =0xE0 use ">>"
// 或者 X8+X5+X4+1 = 1 00110001 = 0x31 rev= 10001100 =0x8C
unsigned char CRC8(unsigned char *ptr,unsigned char len)
{
unsigned char crc;
unsigned char i;
crc = 0;
while(len--)
{
crc ^= *ptr++;
for(i = 0;i < 8;i++)
{
if(crc & 0x80) crc = (crc << 1) ^ 0x07;
else crc <<= 1;
}
}
return crc;
}
#if 0
BYTE str[] ={0x55,0x55,0x01,0x04,0x00,0x04,0x14};// 0xB5
BYTE str1[]={0x55,0x55,0x01,0x04,0x01,0x04,0x32};// 0xC2
BYTE crc;
crc=CRC8(str,7);
afxDump.HexDump( "0x", &crc, 1, 1 );
crc=CRC8(str1,7);
afxDump.HexDump( "0x", &crc, 1, 1 );
// afxDump << poly << " poly\n";// =0x51 = 1 01010001 X8+X6+X4+X0
#endif
// data為指向校驗資料的指標,length為長度,回傳一個位元組的校驗碼
BYTE CRC8Rev(unsigned char *ptr, unsigned char len)
{
unsigned char crc = 0;// or 0xFF;
int i;
ptr += len-1;
while(len--)
{
crc ^= *ptr--;
for(i = 8;i > 0; i--)
{
if(crc & 1) crc = (crc >> 1) ^ 0xE0;
else crc >>= 1;
}
}
return crc;
}
uj5u.com熱心網友回復:
網上爬個現成的吧?uj5u.com熱心網友回復:
這CSDN的廣告真的是醉了
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/68652.html
標籤:硬件/系統
上一篇:播放視頻的時候 螢屏水印一直閃
