谁有用C语言编写的CRC-16校验形式的代码~·高分求

作者&投稿:宥绍 (若有异议请与网页底部的电邮联系)
求教C语言编写的CRC16的校验程序~

unsigned short crc_dsp(unsigned short reg, unsigned char data_crc)
//reg为crc寄存器, data_crc为将要处理的8bit数据流
{
unsigned short msb; //crc寄存器将移出的最高1bit
unsigned short data;
unsigned short gx = 0x8005, i = 0; //i为左移次数, gx为生成多项式

data = (unsigned short)data_crc;
data = data << 8;
reg = reg ^ data;
do
{
msb = reg & 0x8000;
reg = reg << 1;
if(msb == 0x8000)
{
reg = reg ^ gx;
}
i++;
}
while(i < 8);
return (reg);
}

#include

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;
crc.crc16 = 0xffff;
int i, l;
for (i=0; i<size; i++)
{
uchar ch = ba[i];
crc.by[0] = crc.by[0] ^ ch;
for (l=0; l<8; l++)
{
if (crc.by[0] & 0x01)
{
crc.crc16 = crc.crc16 >> 1;
crc.crc16 = crc.crc16 ^ 0xa001;
}
else
{
crc.crc16 = crc.crc16 >> 1;
}
}
}
uchar swap = crc.by[0];
crc.by[0] = crc.by[1];
crc.by[1] = swap;
return crc.crc16;
}

void main()
{
uchar ba[8] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08};
CRC crc;
//计算CRC码
crc.crc16 = CRC16(ba, 8);
printf("高字节:0x%x, 低字节:0x%x
", crc.by[1], crc.by[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 校验失败!");
}
}

#define crc16_polynomial 0x8005 // crc_16校验方式的多项式.

typedef unsigned char uchar;
typedef unsigned int uint;
typedef unsigned long ulong;
typedef enum tagboolean { false, true } bool;

ulong g_ultable[256];

// crc_16方式校验的初始化函数, 计算crc_16余数表.
void _far crc16init(void)
{
uint nremainder;
int n, m;
ulong *pultable = g_ultable;

for(n = 0; n < 256; n ++)
{
nremainder = (uint)n << 8;
for(m = 8; m > 0; m --)
{
if(nremainder & 0x8000)
{
nremainder = (nremainder << 1) ^ crc16_polynomial;
}
else
{
nremainder = (nremainder << 1);
}
}
*(pultable + n) = nremainder;
}
}

// 以crc_16方式计算一个数据块的crc值.
// pucdata - 待校验的数据块指针.
// nbytes - 数据块大小, 单位是字节.
// 返回值是无符号的长整型, 其中低16位有效.
ulong _far crc16calc(uchar *pucdata, int nbytes)
{
uint nremainder, nret;
int n;
uchar index;
ulong *pultable = g_ultable;

nremainder = 0x0000;
for(n = 0; n < nbytes; n ++)
{
index = (uchar)crcbitreflect(*(pucdata + n), 8) ^ (nremainder >> 8);
nremainder = (uint)*(pultable + index) ^ (nremainder << 8);
}
nret = (uint)crcbitreflect(nremainder, 16) ^ 0x0000;
return(nret);
}

// 反转数据的比特位, 反转后msb为1.
// 反转前: 1110100011101110 0010100111100000
// 反转后: 1111001010001110 1110001011100000
ulong _far crcbitreflect(ulong uldata, int nbits)
{
ulong ulresult = 0x00000000l;
int n;

for(n = 0; n < nbits; n ++)
{
if(uldata & 0x00000001l)
{
ulresult |= (ulong)(1l << ((nbits - 1) - n));
}
uldata = (uldata >> 1);
}
return(ulresult);
}

unsigned short crc16table[]=
{
0x0000,0xc0c1,0xc181,0x0140,0xc301,0x03c0,0x0280,0xc241,0xc601,0x06c0,0x0780,0xc741,0x0500,0xc5c1,0xc481,0x0440,
0xcc01,0x0cc0,0x0d80,0xcd41,0x0f00,0xcfc1,0xce81,0x0e40,0x0a00,0xcac1,0xcb81,0x0b40,0xc901,0x09c0,0x0880,0xc841,
0xd801,0x18c0,0x1980,0xd941,0x1b00,0xdbc1,0xda81,0x1a40,0x1e00,0xdec1,0xdf81,0x1f40,0xdd01,0x1dc0,0x1c80,0xdc41,
0x1400,0xd4c1,0xd581,0x1540,0xd701,0x17c0,0x1680,0xd641,0xd201,0x12c0,0x1380,0xd341,0x1100,0xd1c1,0xd081,0x1040,
0xf001,0x30c0,0x3180,0xf141,0x3300,0xf3c1,0xf281,0x3240,0x3600,0xf6c1,0xf781,0x3740,0xf501,0x35c0,0x3480,0xf441,
0x3c00,0xfcc1,0xfd81,0x3d40,0xff01,0x3fc0,0x3e80,0xfe41,0xfa01,0x3ac0,0x3b80,0xfb41,0x3900,0xf9c1,0xf881,0x3840,
0x2800,0xe8c1,0xe981,0x2940,0xeb01,0x2bc0,0x2a80,0xea41,0xee01,0x2ec0,0x2f80,0xef41,0x2d00,0xedc1,0xec81,0x2c40,
0xe401,0x24c0,0x2580,0xe541,0x2700,0xe7c1,0xe681,0x2640,0x2200,0xe2c1,0xe381,0x2340,0xe101,0x21c0,0x2080,0xe041,
0xa001,0x60c0,0x6180,0xa141,0x6300,0xa3c1,0xa281,0x6240,0x6600,0xa6c1,0xa781,0x6740,0xa501,0x65c0,0x6480,0xa441,
0x6c00,0xacc1,0xad81,0x6d40,0xaf01,0x6fc0,0x6e80,0xae41,0xaa01,0x6ac0,0x6b80,0xab41,0x6900,0xa9c1,0xa881,0x6840,
0x7800,0xb8c1,0xb981,0x7940,0xbb01,0x7bc0,0x7a80,0xba41,0xbe01,0x7ec0,0x7f80,0xbf41,0x7d00,0xbdc1,0xbc81,0x7c40,
0xb401,0x74c0,0x7580,0xb541,0x7700,0xb7c1,0xb681,0x7640,0x7200,0xb2c1,0xb381,0x7340,0xb101,0x71c0,0x7080,0xb041,
0x5000,0x90c1,0x9181,0x5140,0x9301,0x53c0,0x5280,0x9241,0x9601,0x56c0,0x5780,0x9741,0x5500,0x95c1,0x9481,0x5440,
0x9c01,0x5cc0,0x5d80,0x9d41,0x5f00,0x9fc1,0x9e81,0x5e40,0x5a00,0x9ac1,0x9b81,0x5b40,0x9901,0x59c0,0x5880,0x9841,
0x8801,0x48c0,0x4980,0x8941,0x4b00,0x8bc1,0x8a81,0x4a40,0x4e00,0x8ec1,0x8f81,0x4f40,0x8d01,0x4dc0,0x4c80,0x8c41,
0x4400,0x84c1,0x8581,0x4540,0x8701,0x47c0,0x4680,0x8641,0x8201,0x42c0,0x4380,0x8341,0x4100,0x81c1,0x8081,0x4040};

unsigned short crc16(unsigned char* block,int len)
{
int remain=0;
int i;
for(i=0;i<len;i++)
{
remain=(remain>>8) ^ crc16table[(remain^block[i])&0xff];
}
return remain;

}

#define
crc16_polynomial
0x8005
//
crc_16校验式项式.
typedef
unsigned
char
uchar;
typedef
unsigned
int
uint;
typedef
unsigned
long
ulong;
typedef
enum
tagboolean
{
false,
true
}
bool;
ulong
g_ultable[256];
//
crc_16式校验初始化函数,
计算crc_16余数表.
void
_far
crc16init(void)
{
uint
nremainder;
int
n,
m;
ulong
*pultable
=
g_ultable;
for(n
=
0;
n
<
256;
n
++)
{
nremainder
=
(uint)n
<<
8;
for(m
=
8;
m
>
0;
m
--)
{
if(nremainder
&
0x8000)
{
nremainder
=
(nremainder
<<
1)
^
crc16_polynomial;
}
else
{
nremainder
=
(nremainder
<<
1);
}
}
*(pultable
+
n)
=
nremainder;
}
}
//
crc_16式计算数据块crc值.
//
pucdata
-
待校验数据块指针.
//
nbytes
-
数据块,
单位字节.
//
返值符号整型,
其低16位效.
ulong
_far
crc16calc(uchar
*pucdata,
int
nbytes)
{
uint
nremainder,
nret;
int
n;
uchar
index;
ulong
*pultable
=
g_ultable;
nremainder
=
0x0000;
for(n
=
0;
n
<
nbytes;
n
++)
{
index
=
(uchar)crcbitreflect(*(pucdata
+
n),
8)
^
(nremainder
>>
8);
nremainder
=
(uint)*(pultable
+
index)
^
(nremainder
<<
8);
}
nret
=
(uint)crcbitreflect(nremainder,
16)
^
0x0000;
return(nret);
}
//
反转数据比特位,
反转msb1.
//
反转前:
1110100011101110
0010100111100000
//
反转:
1111001010001110
1110001011100000
ulong
_far
crcbitreflect(ulong
uldata,
int
nbits)
{
ulong
ulresult
=
0x00000000l;
int
n;
for(n
=
0;
n
<
nbits;
n
++)
{
if(uldata
&
0x00000001l)
{
ulresult
|=
(ulong)(1l
<<
((nbits
-
1)
-
n));
}
uldata
=
(uldata
>>
1);
}
return(ulresult);
}


c语言可以编写c语言的软件有哪些?
c语言是一种面向过程、抽象化的通用程序设计语言,可以编写c语言的软件有Vim、C++编译器、Dev-C++、Code::Blocks、Visual Studio等。1、Vim是一个功能强大、高度可定制的文本编辑器,被推崇为类Vi编辑器中最好的一个。2、C++编译器是一个C\/C++编译器,其功能完整、包含多种SDK,且容量极小,安装版...

用c语言编写的程序被称为
C语言是非常流行的编程语言,被广泛用于操作系统、应用程序、嵌入式系统、网络编程等领域。C语言编写的程序被称为“C程序”,C程序是一种计算机程序,由C语言编写而成,可以在各种平台上运行。C程序可以用于创建各种类型的应用程序,如操作系统、编译器、数据库、网站和游戏等。C语言编写程序 C程序还可以...

C语言编程题目
下面是一些C编程题目:1. 编写程序,从键盘输入两个整数,输出它们的和、差、积、商、余数。2. 编写程序,从键盘输入三角形的三条边长,判断它们是否可以构成三角形,并输出三角形的类型(等边、等腰、一般)。3. 编写程序,从键盘输入字符串,统计其中的大写字母、小写字母、数字和其他字符的个数,并...

用c语言编写的三角形输入程序是什么?
C语言编写的三角形输入程序通常用于接收用户输入的三角形的三条边长,并判断该三角形的类型,比如是等边三角形、等腰三角形还是一般三角形。下面是一个简单的示例代码:include <stdio.h> void checkTriangle(int side1, int side2, int side3){ if (side1 == side2 && side2 == side3) { pr...

如何用C语言编写一个简单的程序!
01 鼠标左键双击c语言软件,打开,打开后界面如图,点击关闭即可 02 点击上方程序窗口左上角的文件,选择新建 03 在打开的窗口中选择文件,下边一般是第四个 c++Source file,输入文件名(hellw.c),一定要以“.

如何用c语言编写一个程序,实现按从大到小的顺序排序输出10个数_百度知...
用选择排序法编写c语言,实现从键盘上输入10个数,按从大到小的顺序排序输出。代码如下:include<stdio.h> int main(){ int i,j,a[10],t;printf("输入数");for (i = 0; i < 10; i++)scanf("%d",&a[i]);for (i = 0; i < 10; i++){ for (j = i + 1; j < 10;j...

用C语言编写一个计算最大值的程序
C程序代码如下:解析:1、首先定义a,b,c,max四个整型变量,并输入a,b,c三个数;2、定义最大值为a,if循环体还是对b和c进行循环;3、根据循环体判断最大的值,最后输出结果。

C语言编写一个软件(如何用c语言编写一个真正的软件)
1、首先打开pellesC,创建一个新的项目文件。2、然后输入简单的框架。3、接着用switch函数完成加减乘除操作。4、检查输入之后就可以计算结果了。这里需要添加的代码如下,之后便可以运行了。5、这里我们输入一个例子。

哪些系统软件是C语言开发的(c语言适用于系统软件的开发)
UNIX,也适用于多种机型。C语言对操作系统和系统使用程序以及需要对硬件进行操作的场合,用C语言明显优于其它解释型高级语言,有一些大型应用软件也是用C语言编写的。C语言具有绘图能力强,可移植性,并具备很强的数据处理能力,因此适于编写系统软件,三维,二维图形和动画。它是数值计算的高级语言。

c语言用什么编程软件
1. C语言编程可使用多种软件进行,其中包括Code Blocks、Eclipse、CLion、Microsoft Visual C++、Microsoft Visual Studio、WaTCom C++、NetBeans、Atom、PlatformIO和Sublime Text等。2. Code Blocks是一个开源的、多平台的C\/C++集成开发环境,它完全用C++编写,支持语法高亮显示,代码补全,工程管理和项目...

洪洞县13513118664: 求教C语言编写的CRC16的校验程序 -
项便盐酸: unsigned short crc_dsp(unsigned short reg, unsigned char data_crc) //reg为crc寄存器, data_crc为将要处理的8bit数据流 { unsigned short msb; //crc寄存器将移出的最高1bit unsigned short data; unsigned short gx = 0x8005, i = 0; //i为左移次数, ...

洪洞县13513118664: 我要用C语言编写CRC16效验码.通过输入一个串然后计算出CRC16效验码.例如:输入010600001388计算得到849C -
项便盐酸: int cal_crc(unsigned char *ptr, unsigned char len) { unsigned char i; unsigned int crc_value =0; while(len--) { for(i=0x80; i!=0; i>>=1 ) { if (crc_value&0x8000) crc_value = (crc_value << 1) ^0x8005 ; else crc_value = crc_value << 1 ; if(*ptr&i) 另外,站长团上有产品团购,便宜有保证

洪洞县13513118664: C语言零基础,怎么用C语言实现CRC16检验码 -
项便盐酸: 1.系统先把所有的float转换为double类型运算,最终得到的结果截取前七个作为有效数字,这样做可以使计算结果更准确. 2.有效数字:从左边第一个不是0的数字起,到精确到的位数止,所有的数字都叫做这个数的有效数字.比如:1.24的有效...

洪洞县13513118664: 谁有51单片机串口通信crc16校验C程序 -
项便盐酸: unsigned int mc_crc16(unsigned char *daBuf,unsigned char len)//Crc16校验 { bit BitFg; unsigned char idata i,j; unsigned char BiTemp=0; unsigned int idata CRCBuf = 0xffff; for(j=0;j{ CRCBuf ^= daBuf[j]; for(i=0;i{ BitFg = CRCBuf&1; CRCBuf >>= 1; if(BitFg==1) CRCBuf ^= 0xa001; CRCBuf = CRCBuf&0xffff; } } return(CRCBuf); }

洪洞县13513118664: 求一个C语言实现的CRC16位校验码生成程序,不用实现校验,只要给定一个待传输数,能生成最终CRC码就好. -
项便盐酸: 答案应该是:fcs-32

洪洞县13513118664: 求把这段C语言的CRC16校验代码转换成C#代码 -
项便盐酸: static void Main(string[] args) { int i = CRC16("2200000C20140730111000000038465E4DA6F447D4992B0ABDD343CC110C02000105000703102015073000000000", "2200000C20140730111000000038465E4DA6F447D4992B0...

洪洞县13513118664: C语言编程,得到crc校验结果为4406,要如何将它和之前的data[6]一起放入Newdata[8],变成 新的Newdata[8] -
项便盐酸: char i; for (i=0; i Newdata[i] = data[i]; Newdata[i++] = (crc16>>8)&0xFF; Newdata[i++] = crc16&0xFF;

洪洞县13513118664: C语言中CRC循环校验的一个程序 -
项便盐酸: while(len--!=0) 这句的len的值循环一次就减少1,先执行len!=0,再执行len--.当len为0时退出循环.for(i=0x80; i!=0; i/=2) 0x80是十六进制数,也即128 当i!=0时,执行循环体,然后i=i/2,即i值减半.

洪洞县13513118664: 易语言CRC16效验程序 -
项便盐酸: CRC校验是循环冗余校验,下面是C#的代e68a84e79fa5e9819331333366306433码. protected byte[] GetCRC(byte[] b, int offset, int len) { byte CRC16Lo = 0; byte CRC16Hi = 0; byte bytC; byte bytTreat; byte bytBcrc; for (int i = 0; i < len; i++) { ...

洪洞县13513118664: 用C++或C语言编一个CRC校验程序,求救啊,可以发邮箱里
项便盐酸: string CRC(string a,string b){ //CRC校验,a为被除数,b为除数(a,b均为二进制字符串) string s1,s2,temp; int len; len = b.length(); for(int i=0;i&lt;len-1;i++) a.append("0"); while(a.length()&gt;=b.length()){ s2 = ""; s1 = a.substr(0,len); a = a....

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网