📄 dataanalysisengine.cpp
字号:
// DataAnalysisEngine.cpp: implementation of the CDataAnalysisEngine class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "NetInterface.h"
#include "DataAnalysisEngine.h"
#include "Data.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CDataAnalysisEngine::CDataAnalysisEngine()
{
}
CDataAnalysisEngine::~CDataAnalysisEngine()
{
}
//计算CRC较验码
unsigned int CDataAnalysisEngine::Cal_Crc(unsigned char *data_to_cal_crc, int len)
{
unsigned int crc;
unsigned char i;
crc = 0xFFFF; //CRC初始值
while (len-- != 0)
{
crc = crc ^ ((unsigned int)*data_to_cal_crc++ << 8);
for (i = 0; i < 8; ++i)
if (crc & 0x8000)
crc = (crc << 1) ^ 0x1021;
else
crc = crc << 1;
}
return (crc & 0xFFFF);
}
/////////////////////////////////////////////////////////////////////////////////////
//数据校验采用CRC校验算法,并且高位在前
//数据包格式:包头(4)+总长度(2)+包头,总长度校验码(2)+
// 协议号(1)+命令号(1)+数据内容(<=4096)+数据包校验码(2)(校验内容:整个包,除去这个校验码本身的其它部分)
/////////////////////////////////////////////////////////////////////////////////////
//prev: pdata->rawData,pdata->rawDataLen
//after:pdata->m_nOrderGroup,pdata->m_nOrder,pdata->fineData,pdata->fineDataLen
/////////////////////////////////////////////////////////////////////////////////////
BOOL CDataAnalysisEngine::DisComposeData(CData *pdata)
{
BOOL bRet=TRUE;
MyString.GetString(pdata->rawData,pdata->rawDataLen);
int nHeadPos=MyString.Find(CMD_HEAD,4);
if(nHeadPos==-1)//没找到包头
{
bRet=FALSE;
}
else
{
char *pHead=&pdata->rawData[nHeadPos];
//得到传过来的包头CRC码
UINT getCRC=((UCHAR)pHead[6]<<8)|(UCHAR)pHead[7];
//计算的包头CRC码
UINT calCRC=Cal_Crc((unsigned char *)pHead,6);
if(getCRC!=calCRC)
{
bRet=FALSE;
}
else
{
//得到包的总长度
int nLen=((UCHAR)pHead[4]<<8)|(UCHAR)pHead[5];
if(pdata->rawDataLen<(DWORD)(nHeadPos+nLen))//接收的数据长度不足
{
bRet=FALSE;
}
else
{
getCRC=((UCHAR)pHead[nLen-2]<<8)|(UCHAR)pHead[nLen-1];
calCRC=Cal_Crc((unsigned char *)pHead,nLen-2);
if(getCRC!=calCRC)
{
bRet=FALSE;
}
else
{
//得到命令分组号,命令号,数据,数据长度
pdata->m_nOrderGroup=pHead[8];
pdata->m_nOrder=pHead[9];
memcpy(pdata->fineData,pHead+10,nLen-12);
pdata->fineDataLen=nLen-12;
}
}
}
}
return bRet;
}
/////////////////////////////////////////////////////////////////////////////////////
//数据校验采用CRC校验算法,并且高位在前
//数据包格式:包头(4)+总长度(2)+包头,总长度校验码(2)+
// 协议号(1)+命令号(1)+数据内容(<=4096)+数据包校验码(2)
//合成数据包
//prev:pdata->m_nOrderGroup,pdata->m_nOrder,pdata->fineData,pdata->fineDataLen
//after: pdata->rawData,pdata->rawDataLen
/////////////////////////////////////////////////////////////////////////////////////
BOOL CDataAnalysisEngine::ComposeData(CData *pdata)
{
UINT uCRC;
int len=0;
//加入包头
memcpy(pdata->rawData,CMD_HEAD,4);
len+=4;
//加入总长度
int nLen=12+pdata->fineDataLen;
pdata->rawData[len]=0xFF&(nLen>>8); //高位
pdata->rawData[len+1]=nLen&(0xFF); //低位
len+=2;
//加入 包头校验码
uCRC=Cal_Crc((unsigned char*)pdata->rawData,6);
pdata->rawData[len]=0xFF&(uCRC>>8); //高位
pdata->rawData[len+1]=0xFF&uCRC; //低位
len+=2;
//加入命令分组号,命令号
pdata->rawData[len]=0xFF&(pdata->m_nOrderGroup);
pdata->rawData[len+1]=0xFF&(pdata->m_nOrder);
len+=2;
//加入数据内容
memcpy(pdata->rawData+len,pdata->fineData,pdata->fineDataLen);
len+=pdata->fineDataLen;
//加入包数据校验码
uCRC=Cal_Crc((unsigned char*)pdata->rawData,nLen-2);
pdata->rawData[len]=0xFF&(uCRC>>8); //高位
pdata->rawData[len+1]=0xFF&uCRC; //低位
len+=2;
//得到合成后数据包的长度
pdata->rawDataLen=nLen;
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -