📄 protocolfun.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 + -