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

📄 protocolfun.cpp

📁 MDF监控源码2
💻 CPP
字号:
// Protocolfun.cpp : 实现文件
//

#include "stdafx.h"
#include "Protocolfun.h"



// CProtocolfun

//##ModelId=4652869E032D
CProtocolfun::CProtocolfun()
{
}

//##ModelId=4652869E032E
CProtocolfun::~CProtocolfun()
{
}

//##ModelId=4652869E033D
UCHAR CProtocolfun::HexToASCII(UCHAR *buf)
{
	
	UCHAR ucTemp ;
	const UCHAR tab[]="0123456789ABCDEF";	// 0x0-0xf的字符查找表
	ucTemp = tab[*buf & 0x0f];	// 输出低4位
	return ucTemp ;

}
// CProtocolfun 成员函数


//单个ASCII码转为二进制。*******
//##ModelId=44B6F8840177
UCHAR CProtocolfun::ASCIIToHex(UCHAR *buf)
{

	UCHAR ucSum ;

	if( *buf >= '0' && *buf <= '9' )
	{
		ucSum = (*buf - 0x30) ;
	}
	else if( *buf >= 'A' && *buf <= 'Z' )
	{
		ucSum = *buf - 0x37 ;
	}
	else if( *buf >= 'a' && *buf <= 'z' )
	{
		ucSum = *buf - 0x57 ;
	}

	return ucSum ;

}


//CHKSUM 转为 string ******
//##ModelId=44B6F8840179
CString CProtocolfun::CHKSUMToString(DWORD dwSum)
{
	UINT i ;
	UCHAR	ucTemp ;
	CString strTemp ;

	strTemp.Empty() ;

	for(i=0 ; i < 4 ; i++)
	{
		ucTemp = (UCHAR)(0X0F & dwSum) ;
		ucTemp = HexToASCII(&ucTemp) ;

		strTemp.Insert(0,ucTemp) ;

		dwSum >>= 4 ;
	}

	return strTemp ;

}


//判断长度校验和*********
//##ModelId=44B6F8840196
BOOL CProtocolfun::CheckLCHKSUM(UCHAR *buf, DWORD len)
{
	//-问题-
	CString strTip ;
	DWORD i ;
	UCHAR ucSum , ucCheck;
	try
	{

		ucCheck = *buf >> 4  ;		//取出长度检验码

		ucSum = *buf & 0X0F ;		//获取LCHKSUM
		//求长度校验和
		for( i=0 ; i < len - 1 ; i++ )
		{
			buf++ ;
			ucSum += *buf >> 4 ;
			ucSum += *buf & 0X0F ;
		}							

		ucSum = ~ucSum + 1 ;		//取反加1
		ucSum &= 0X0F ;

		if( ucCheck == ucSum )
			return TRUE ;
		else
			return FALSE ;
	}
	catch(_com_error e)
	{
		strTip.Format( "异常:LCHKSUM 检验和产生异常:%s ",(LPCSTR)e.Description() ) ;
		TRACE0(strTip) ;
		return FALSE ;
	}
}




//判断数据包内容校验和 ***********
//##ModelId=44B6F8840199
BOOL CProtocolfun::CheckCHKSUM(UCHAR *pPack , DWORD len , UCHAR* buf , UINT unLen ) 
{
	CString strTip ;
	DWORD dwCheck , dwSum ;
	dwCheck = 0 ;

	try
	{
		dwCheck = *buf++ << 8 ;
		dwCheck |= *buf ;
		dwSum = GetCHKSUM( pPack , len ) ;
		if( dwSum == dwCheck ) 
			return TRUE ;
		else
			return FALSE ;
	}
	catch(_com_error e)
	{
		strTip.Format( "异常:CHKSUM 检验和产生异常:%s ",(LPCSTR)e.Description() ) ;
		TRACE0(strTip) ;
		return FALSE ;
	}
}


//获得LCHAKSUM*****
//##ModelId=44B6F884018A
UCHAR CProtocolfun::GetLCHKSUM(UCHAR *buf , DWORD len)
{
	DWORD	i ;
	UCHAR	ucSum ;
	CString strTip ;
	try
	{
		for(i = 0 , ucSum = 0 ; i < len ; i++)
		{
			ucSum += ASCIIToHex(buf++) ;
		}
		ucSum = ucSum % 16 ;						//模16取余数
		ucSum = ~ucSum + 1 ;						//取反加1
		ucSum &= 0X0F ;								//只取低四位
		return HexToASCII(&ucSum) ;
	}
	catch(_com_error e)
	{
		strTip.Format( "异常:CHKSUM 检验和产生异常:%s ",(LPCSTR)e.Description() ) ;
		TRACE0(strTip) ;
		return 0 ;
	}
}


//获的2个字节的LENGTH长度的ASCII码4字节表示表示 ******
//##ModelId=44B6F884016A
CString CProtocolfun::GetLENGTH(UINT iNum)
{
	int i ;
	UCHAR ucTemp ;
	UCHAR ucSum ;
	CString strTemp ;

	strTemp.Empty() ;
	ucSum = 0 ;

	if( iNum < 4096 )
	{
		for( i=0 ; i < 3 ; i++ )
		{
			ucTemp = iNum & 0X0F ;		//获得各位的十六进制数
			ucSum += ucTemp ;			//计算LCHKSUM

			strTemp.Insert( 0 , HexToASCII(&ucTemp) ) ;

			iNum >>= 4 ;				//右移4位
		}
		//计算LCHKSUM 
		ucSum = ~ucSum  + 1 ;			//取反加一
		ucSum &= 0X0F ;					//取低4位

		strTemp.Insert( 0 , HexToASCII(&ucSum) ) ;

		return strTemp ;
	}
	else
	{
		return "LENGTH 的值需小于4096" ; //错误描述的长度必须大于4个字符
	}
}

//获得CHKSUM*********
//##ModelId=44B6F8840187
DWORD CProtocolfun::GetCHKSUM(UCHAR *buf, DWORD len)
{
	DWORD i,iSum ;
	CString strTip ;
	try
	{
		for( i=0 , iSum = 0 ; i < len ; i++ )
			iSum += *buf++ ;

		iSum = iSum % 65536 ;						//模65536取余数
		iSum = ~iSum + 1 ;							//取反加1
		iSum &= 0XFFFF ;							//只取低四字节

		return iSum ;
	}
	catch(_com_error e)
	{
		strTip.Format( "获得 CHKSUM 检验和产生异常(GetCHKSUM):%s ",(LPCSTR)e.Description() ) ;
		TRACE0(strTip) ;
		return 0 ;
	}
}

//##ModelId=4652869E037D
CString CProtocolfun::ToHexString(char * cBuf, int iLen)
{
	CString sResult,strTemp;
	BYTE bt;
	sResult.Empty();
	if (iLen > 0)
	{
		for(int i=0;i<iLen;i++)
		{
			bt = *cBuf++;
			strTemp.Format("%0.2X ",bt);
			sResult += strTemp;
			//ToHex(bt);

		}
	}
	return sResult;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -