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

📄 lpackage.cpp

📁 c++实现的协议打包解包程序代码
💻 CPP
字号:
// LPackage.cpp: implementation of the CLPackage class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "LPackage.h"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
//#include <Winsock2.h>

//##ModelId=3E795F870360
CLPackage::CLPackage()
{
	lLenWordPos =4;//设置报文中放长度的long的位置
	lPackHeadLen =12;  //报文全长=PACK_HEAD_LEN + 报文中标记长度
	InitPack();
}

//##ModelId=3E795F87036A
CLPackage::~CLPackage()
{

}

//##ModelId=3E795F87034F
void CLPackage::InitPack()
{
	memset(m_szBuf,0,PACK_BUF_SIZE);//缓冲区
	m_lBufLen=0;
}

//##ModelId=3E795F87034C
long CLPackage::SetBuffer(char *szBuf, long lBufLength)
{
	if((lBufLength>PACK_BUF_SIZE)||(szBuf==NULL))
		return false;
	m_lBufLen=lBufLength;
	memcpy(m_szBuf,szBuf,lBufLength);
	return true;
}

//##ModelId=3E795F87037E
long CLPackage::GetVar(char *szPointer, long lLength)
{
	if((lLength>PACK_BUF_SIZE)||(lLength>m_lBufLen))
		return false;
	if(szPointer!=NULL)
		memcpy(szPointer,m_szBuf,lLength);
	memcpy(m_szBuf,m_szBuf+lLength,m_lBufLen-lLength);
	m_lBufLen-=lLength;
	return true;
}

//##ModelId=3E795F870339
unsigned long CLPackage::GetDword()
{
	unsigned long dTemp=0;
	GetVar((char*)&dTemp,sizeof(unsigned long));
	return htonl_my(dTemp);
}

//##ModelId=3E795F870338
unsigned short CLPackage::GetWord()
{
	unsigned short wTemp=0;
	GetVar((char*)&wTemp,sizeof(unsigned short));
	return htons_my(wTemp);
}

//##ModelId=3E795F87032F
int CLPackage::GetInt()
{
	int iTemp=0;
	GetVar((char*)&iTemp,sizeof(int));
	return htonl_my(iTemp);
}

//##ModelId=3E795F87032E
unsigned char CLPackage::GetByte()
{
	unsigned char Temp=0;
	GetVar((char*)&Temp,sizeof(unsigned char));
	return Temp;
}

//##ModelId=3E795F87031B
long CLPackage::GetStrByLen(char *szOut, long lLen)
{
	if(szOut!=NULL)
		szOut[lLen]=0;
	return GetVar(szOut,lLen);
}

//##ModelId=3E795F870309
long CLPackage::GetString(char *szOut,long lBufLen)
{
	bool bOK=false;
	int i=0;
	for(i=0;i<=m_lBufLen;i++)
	{
		if(m_szBuf[i]==0)
		{
			bOK=true;
			break;
		}
	}
	if((!bOK)||(i>=lBufLen))
		return false;
	szOut[i]=0;
	return GetVar(szOut,i+1);
}

//##ModelId=3E795F87036C
long CLPackage::PutVar(char *szData, long lLength)
{
	if(((lLength+m_lBufLen)>PACK_BUF_SIZE)||(szData==NULL))
	{
		InitPack();
		return false;
	}
	memcpy(m_szBuf+m_lBufLen,szData,lLength);
	m_lBufLen+=lLength;
	return true;
}

//##ModelId=3E795F870307
long CLPackage::SetByte(unsigned char cByte)
{
	return PutVar((char*)&cByte,sizeof(unsigned char));
}

//##ModelId=3E795F8702F3
long CLPackage::SetDword(unsigned long dData)
{
	dData=htonl_my(dData);
	return PutVar((char*)&dData,sizeof(unsigned long));

}

//##ModelId=3E795F8702E9
long CLPackage::SetWord(unsigned short dData)
{
	dData=htons_my(dData);
	return PutVar((char*)&dData,sizeof(unsigned short));

}

//##ModelId=3E795F8702DF
long CLPackage::SetInt(int iData)
{
	iData=htonl_my(iData);
	return PutVar((char*)&iData,sizeof(int));
}

//##ModelId=3E795F8702D4
long CLPackage::SetStr(char *szData)
{
	return PutVar(szData,strlen(szData));
}

//##ModelId=3E795F8702CB
char* CLPackage::GetBuf()
{
	return m_szBuf;
}

//##ModelId=3E795F8702CA
long CLPackage::GetLength()
{
	return m_lBufLen;
}

//##ModelId=3E795F8702B7
long CLPackage::SetStrByLen(char *szData, long lLength)
{
	if(szData==NULL)
	{
		m_lBufLen+=lLength;
		return false;
	}
	PutVar(szData,strlen(szData)+1);
	m_lBufLen+=lLength-strlen(szData)-1;
	return true;
}

//##ModelId=3E795F8702AD
long CLPackage::EndSetPackLen(long lLength)
{
	if(lLength==-1)
		lLength=m_lBufLen;
	lLength-=lPackHeadLen;
	long lTemp=htonl_my(lLength);
	memcpy(m_szBuf+lLenWordPos,(char*)&lTemp,sizeof(long));
	return true;
}

//##ModelId=3E795F8702A2
long CLPackage::AddBuf(char *szData, long lLen)
{
	return PutVar(szData,lLen);
}

//##ModelId=3E795F870299
long CLPackage::GetPackage(CLPackage &cPack)
{
	//printf("%s\n",m_szBuf);
	if(m_lBufLen<(lLenWordPos+4))
		return false;
	//=================
	long lFlag=0;
	memcpy(&lFlag,m_szBuf,4);
	lFlag=htonl_my(lFlag);
	if(lFlag!=GAME_MAGIC)
	{
		InitPack();
		return -1;
	}
	//======================
	long lLength=0;
	memcpy(&lLength,m_szBuf+lLenWordPos,4);
	lLength=htonl_my(lLength);
	lLength+=lPackHeadLen;//报文全长
	if(lLength>PACK_BUF_SIZE)//错误的报文
	{
		InitPack();
		return -1;
	}
	if(lLength>m_lBufLen)
		return false;
	char szTemp[PACK_BUF_SIZE];
	GetVar(szTemp,lLength);
	cPack.InitPack();
	cPack.SetBuffer(szTemp,lLength);
	return true;
}

//##ModelId=3E795F870284
long CLPackage::MakeHead(long lCommand,unsigned long lSque)
{///rebuild
	InitPack();
	SetInt(0);
	SetInt(htonl_my(lCommand));
	SetDword(htonl_my(NULL));
	SetDword(htonl_my(lSque));
	EndSetPackLen();
	return true;
}

//##ModelId=3E795F87027A
long CLPackage::SetStr2(char *szData)
{
	return PutVar(szData,strlen(szData)+1);
}

//##ModelId=3E795F870270
void CLPackage::Set(long lWordPos, long lHeadLen)
{
	lLenWordPos =lWordPos;//设置报文中放长度的long的位置
	lPackHeadLen =lHeadLen;  //报文全长=PACK_HEAD_LEN + 报文中标记长度
}

//##ModelId=3E795F870266
long CLPackage::htonl_my(long lTemp)
{
	byte* szPoint=(byte*)&lTemp;
	byte bTemp=szPoint[3];
	szPoint[3]=szPoint[0];
	szPoint[0]=bTemp;

	bTemp=szPoint[2];
	szPoint[2]=szPoint[1];
	szPoint[1]=bTemp;
	return lTemp;
}

//##ModelId=3E795F87025B
short CLPackage::htons_my(short sTemp)
{
	byte* szPoint=(byte*)&sTemp;
	byte bTemp=szPoint[1];
	szPoint[1]=szPoint[0];
	szPoint[0]=bTemp;
	return sTemp;
}

//##ModelId=3E795F870252
BOOL CLPackage::GetStringByByteLen(char *szBuf, long lBufLen)
{
	if(szBuf==NULL)
		return FALSE;
	long lLen=GetByte();
	if(lLen>lBufLen)
		return FALSE;
	return GetStrByLen(szBuf,lLen);
}

//##ModelId=3E795F870233
BOOL CLPackage::GetStringByShortLen(char *szBuf, long lBufLen)
{
	if(szBuf==NULL)
		return FALSE;
	long lLen=GetWord();
	if(lLen>lBufLen)
		return FALSE;
	return GetStrByLen(szBuf,lLen);
}

//##ModelId=3E795F87023D
BOOL CLPackage::GetStringByLongLen(char *szBuf, long lBufLen)
{
	if(szBuf==NULL)
		return FALSE;
	long lLen=GetDword();
	if(lLen>lBufLen)
		return FALSE;
	return GetStrByLen(szBuf,lLen);
}

//##ModelId=3E795F87022A
BOOL CLPackage::SetStringAndByteLen(char *szBuf)
{
	if(szBuf==NULL)
		return FALSE;
	long lLen=strlen(szBuf);
	if(lLen>255)
		return FALSE;
	SetByte((byte)lLen);
	return SetStrByLen(szBuf,lLen);
}

//##ModelId=3E795F870220
BOOL CLPackage::SetStringAndShortLen(char *szBuf)
{
	if(szBuf==NULL)
		return FALSE;
	long lLen=strlen(szBuf);
	SetWord((short)lLen);
	return SetStrByLen(szBuf,lLen);
}

//##ModelId=3E795F870215
BOOL CLPackage::SetStringAndLongLen(char *szBuf)
{
	if(szBuf==NULL)
		return FALSE;
	long lLen=strlen(szBuf);
	SetDword(lLen);
	return SetStrByLen(szBuf,lLen);
}

⌨️ 快捷键说明

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