crc16 c代码

crc16 c代码,第1张

0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06, 0x07, 0xC7, 0x05, 0xC5, 0xC4,

0x04, 0xCC, 0x0C, 0x0D, 0xCD, 0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09,

0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A, 0x1E, 0xDE, 0xDF, 0x1F, 0xDD,

0x1D, 0x1C, 0xDC, 0x14, 0xD4, 0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3,

0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3, 0xF2, 0x32, 0x36, 0xF6, 0xF7,

0x37, 0xF5, 0x35, 0x34, 0xF4, 0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A,

0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29, 0xEB, 0x2B, 0x2A, 0xEA, 0xEE,

0x2E, 0x2F, 0xEF, 0x2D, 0xED, 0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26,

0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60, 0x61, 0xA1, 0x63, 0xA3, 0xA2,

0x62, 0x66, 0xA6, 0xA7, 0x67, 0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F,

0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68, 0x78, 0xB8, 0xB9, 0x79, 0xBB,

0x7B, 0x7A, 0xBA, 0xBE, 0x7E, 0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5,

0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71, 0x70, 0xB0, 0x50, 0x90, 0x91,

0x51, 0x93, 0x53, 0x52, 0x92, 0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C,

0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B, 0x99, 0x59, 0x58, 0x98, 0x88,

0x48, 0x49, 0x89, 0x4B, 0x8B, 0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C,

0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42, 0x43, 0x83, 0x41, 0x81, 0x80,

0x40

};

static unsigned char auchCRCHi[]=

{

0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81,

0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,

0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01,

0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,

0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81,

0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,

0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01,

0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,

0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81,

0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,

0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01,

0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,

0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81,

0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,

0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01,

0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,

0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81,

0x40

};

bool CRCDecToHex(unsigned char Destination[],unsigned char Source,const int DesLen,int &HexBit);

void UCToASCII(unsigned char Lo16[],int len);

unsigned short CRC16(unsigned char puchmsg[],unsigned short usdatalen);

int main()

{

//unsigned char buf[]={0x01,0xA8,0x98,0x42,0x65,0x74,0x74,0x65,0x72,0x17};

//unsigned char buf[]={0x07,0x11,0x41,0x00,0x53,0xB9,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03};

unsigned char buf[]={0x00,0x00,0x01,0x00,0x00,0x00,0x1A,0x00,0x1C,0x03};

//unsigned short Len=10;

//unsigned short Len=19;

unsigned short Len=10;

unsigned char Lo=CRC16(buf,Len)%256;

unsigned char Hi=CRC16(buf,Len)/256;

unsigned char Lo16[4]={0};

unsigned char Hi16[4]={0};

printf(" 十进制:低字节Lo=%d\n 十进制:高字节Hi=%d\n",Lo,Hi);

unsigned char temp=Lo;

int ASCIILoLen=0;

CRCDecToHex(Lo16,temp,4,ASCIILoLen);

UCToASCII(Lo16,ASCIILoLen);

printf(" 低字节:Lo16=");

for (int i=0;i<ASCIILoLen;i++)

printf("%c",Lo16[i]);

printf("H\n");

temp=Hi;

int ASCIIHiLen=0;

CRCDecToHex(Hi16,temp,4,ASCIIHiLen);

UCToASCII(Hi16,ASCIIHiLen);

printf(" 高字节:Hi16=");

for (int I=0;I<ASCIIHiLen;I++)

printf("%c",Hi16[I]);

printf("H\n");

return 1;

}

//十进制转十六进制

bool CRCDecToHex(unsigned char Destination[],unsigned char Source,const int DesLen,int &HexBit)

{

unsigned char temp=Source;

int i=DesLen-1;

while(temp>=16)

{

Destination[i]=temp%16;

printf("Lo[%d]=%d\n",i,Destination[i]);

temp=temp/16;

i--;

}

Destination[i]=temp;

printf("Lo[%d]=%d\n",i,Destination[i]);

HexBit=DesLen-1-i+1;

for(int a=i;(a-i)<(DesLen-1-i+1);a++)

{

Destination[a-i]=Destination[a];

printf("移位后:Lo16[%d]=%d\n",a-i,Destination[a-i]);

}

return true;

}

//无符号字符型转ASCII码

void UCToASCII(unsigned char Lo16[],int len)

{

for(int i=0;i<len;i++)

{

if (Lo16[i]>=10)

{

switch (Lo16[i])

{

case 10:

Lo16[i]='A';break;

case 11:

Lo16[i]='B';break;

case 12:

Lo16[i]='C';break;

case 13:

Lo16[i]='D';break;

case 14:

Lo16[i]='E';break;

case 15:

Lo16[i]='F';break;

default: break;

}

}

else

{

Lo16[i]+=48;

}

}

}

unsigned short CRC16(unsigned char puchmsg[],unsigned short usdatalen)

{

unsigned char uchCRCHi=0xFF;

unsigned char uchCRCLo=0xFF;

unsigned short uIndex;

unsigned short y=0;

while(usdatalen--)

{

uIndex=uchCRCHi=(unsigned char)(uchCRCHi ^ puchmsg[y++]);

uchCRCHi=(unsigned char)(uchCRCLo ^ auchCRCHi[uIndex]);

uchCRCLo=auchCRCLo[uIndex];

}

return(unsigned short)(uchCRCLo+uchCRCHi256);

#include <stdioh>

typedef unsigned short ushort;

typedef unsigned char uchar;

typedef union _CRC

{

ushort crc16;

uchar by[2];

} CRC;

//输入不带CRC码的数据时,返回值是CRC码

//输入带CRC码的数据时,则可以进行校验,返回0时CRC校验成功,否则CRC校验失败

ushort CRC16(uchar ba, int size)

{

CRC crc;

crccrc16 = 0xffff;

int i, l;

for (i=0; i<size; i++)

{

uchar ch = ba[i];

crcby[0] = crcby[0] ^ ch;

for (l=0; l<8; l++)

{

if (crcby[0] & 0x01)

{

crccrc16 = crccrc16 >> 1;

crccrc16 = crccrc16 ^ 0xa001;

}

else

{

crccrc16 = crccrc16 >> 1;

}

}

}

uchar swap = crcby[0];

crcby[0] = crcby[1];

crcby[1] = swap;

return crccrc16;

}

void main()

{

uchar ba[8] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08};

CRC crc;

//计算CRC码

crccrc16 = CRC16(ba, 8);

printf("高字节:0x%x, 低字节:0x%x\n", crcby[1], crcby[0]);

//CRC校验

uchar bb[10] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0xb0, 0xcf};

if (0 == CRC16(bb, 10))

{

printf("bb 校验成功!");

}

else

{

printf("bb 校验失败!");

}

}

由于函数名CRC16与单元格名称CRC16冲突,所以将函数名改为CRC

Function CRC(ByVal x As Double) As Double

    CRC = x ^ 16 + x ^ 12 + x ^ 5 + 1

End Function

以上就是关于crc16 c代码全部的内容,包括:crc16 c代码、crc如何用c++程序来计算、EXCEL自订函数crc16等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/9343329.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-27
下一篇2023-04-27

发表评论

登录后才能评论

评论列表(0条)

    保存