⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dataanalysisengine.cpp

📁 用事件方式
💻 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 + -