#include "stdafx.h"
#include "CheckSum.h"
#define CHECKVALUE(pt,nl) if((btData==NULL)||(nLength<=0)){AfxMessageBox("无效数组!");return -1;}
CCheckSum::CCheckSum()
{
}
CCheckSum::~CCheckSum()
{
}
//CCITT V.41,x16 + x12 + x5 + 1
WORD CCheckSum::CCITT_CRC_16(BYTE* btData,int nLength)
{
CHECKVALUE(btData,nLength);
WORD CRC=0;
BYTE j;
int i;
for(i=0;i<nLength;i++)
{
CRC^=(btData[i]<<8);
for (j=0;j<8;j++)
{
if(CRC&0x8000)CRC=((CRC<<1)^0x1021);
else CRC<<=1;
}
}
return ((CRC>>8)+(CRC<<8));
}
//ANSI CRC-16,x16 + x15 + x2 + 1
WORD CCheckSum::ANSI_CRC_16(BYTE* btData,int nLength)
{
CHECKVALUE(btData,nLength);
WORD CRC=0xFFFF;
BYTE j,Tmp=0;
int i;
for(i=0;i<nLength;i++)
{
CRC^=btData[i];
for (j=0;j<8;j++)
{
Tmp=CRC&0x0001;
CRC=CRC>>1;
if(Tmp)CRC=(CRC^0xA001);
}
}
return ((CRC>>8)+(CRC<<8));
}
如果嫌多的话,那就请详细的解释一下WORD CCheckSum::CCITT_CRC_16(BYTE* btData,int nLength)
{
CHECKVALUE(btData,nLength);
WORD CRC=0;
BYTE j;
int i;
for(i=0;i<nLength;i++)
{
CRC^=(btData[i]<<8);
for (j=0;j<8;j++)
{
if(CRC&0x8000)CRC=((CRC<<1)^0x1021);
else CRC<<=1;
}
}
return ((CRC>>8)+(CRC<<8));
}
这一小段吧!包括它的逻辑关系,谢谢!
关于校验和计算方面的C++代码,哪位大侠帮忙解读一下,小弟初学,不太懂!谢谢!
答案:1 悬赏:40 手机版
解决时间 2021-01-23 12:47
- 提问者网友:流星是天使的眼泪
- 2021-01-23 07:39
最佳答案
- 五星知识达人网友:老鼠爱大米
- 2021-01-23 09:04
哪里不懂?
补充点操作符:
1) |按位或操作符:result=exp1|exp2;当exp1和exp2中对应位中至少有一个为1时,result中对应位为1,否则为0。
2) & 按位与操作符::result=exp1&exp2;当exp1和exp2中对应位全为1时,result中对应位为1,否则为0。
3)^ 按位异或操作符:result=exp1^exp2;当exp1和exp2中对应位不相同时,result中对应位为1,否则为0。
4)~ 反转操作符:将位容器中的所有位都反转,1变为0,0变为1。
5)<< 按位左移操作符:exp<<n,将容器中所有的位向左移n位,空出的位用0填充。
6) p>> 按位右移操作符:exp>>n,将容器中所有的位向右移n位,空出的位用0填充。
7)|=,&=,^= 分别对应|&^三种操作符的复合操作符。
补充点操作符:
1) |按位或操作符:result=exp1|exp2;当exp1和exp2中对应位中至少有一个为1时,result中对应位为1,否则为0。
2) & 按位与操作符::result=exp1&exp2;当exp1和exp2中对应位全为1时,result中对应位为1,否则为0。
3)^ 按位异或操作符:result=exp1^exp2;当exp1和exp2中对应位不相同时,result中对应位为1,否则为0。
4)~ 反转操作符:将位容器中的所有位都反转,1变为0,0变为1。
5)<< 按位左移操作符:exp<<n,将容器中所有的位向左移n位,空出的位用0填充。
6) p>> 按位右移操作符:exp>>n,将容器中所有的位向右移n位,空出的位用0填充。
7)|=,&=,^= 分别对应|&^三种操作符的复合操作符。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯