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

📄 ppq.cpp

📁 DSP应用实例(一)--轻松实现BT多点下载 源码
💻 CPP
字号:
// PPQ.cpp: implementation of the PPQ class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "PPQ.h"
//#include "RADIX64.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

PPQ::PPQ()
{
	this->m_lpbuff	=NULL;
}

PPQ::~PPQ()
{
	if(this->m_lpbuff!=NULL)
		delete []this->m_lpbuff;
}

/******************************************************************
对象序列化
bool DSPAct::Serialize(BYTE byClassLevels,BYTE byAttrNo,DSP::_DSPPACKET &dsp)
	byClassLevels	--	类的层次
	byAttrNo		--	属性序号
	dsp				--	包含序列化或反序化的DSP包
	返回:	false	--	表示当前对象的属性还没有还原完;
			true	--	表示当前对象的属性已经还原完啦
			如果序列化函数后,设置的缓冲区为NULL,则表示出错。
******************************************************************/
bool PPQ::Serialize(BYTE byClassLevels,BYTE byAttrNo,DSP::_DSPPACKET &dsp)
{
	if(byClassLevels>1)
		return DSPACT::Serialize(byClassLevels-1,byAttrNo,dsp);
	else
	{
		switch(byAttrNo)
		{
			case 1:						//序列化第1个属性
				dsp.Write(this->m_bBOOL);
				return false;
			case 2:						//序列化第2个属性
				dsp.Write(this->m_bBool);
				return false;
			case 3:
				dsp.Write((int)this->m_dwValue);
				return false;
			case 4:
				dsp.Write(this->m_iValue);
				return false;
			case 5:
				dsp.Write(this->m_sValue);
				return false;
			case 6:
				dsp.Write(this->m_wValue);
				return false;
			case 7:
				dsp.Write(this->m_cValue);
				return false;
			case 8:
				dsp.Write(this->m_byValue);
				return false;
			case 9:
				dsp.Write(this->m_hgf,true,true);
				return false;
			case 10:
				dsp.Write(this->m_str);
				return false;
			case 11:						//序列化最后一个属性
				dsp.Write(this->m_chBuff,READ_FILE_SIZE,false);
		}
	}

	return true;
}

/*******************************************************************
对象反序列化
bool DSPAct::UnSerialize(BYTE byClassLevels,BYTE byAttrNo,DSP::_DSPPACKET &dsp,DWORD dwLen)
	byClassLevels	--	类的层次
	byAttrNo		--	属性序号
	dsp				--	包含序列化或反序化的DSP包
	dwLen			--	属性的长度
	返回:	false	--	表示当前对象的属性还没有还原完;
			true	--	表示当前对象的属性已经还原完啦
		如果反序列化函数返回时,设定的缓冲区为NULL或缓冲区的尺寸小于应该设定的尺寸,则表示出错。
******************************************************************/
bool PPQ::UnSerialize(BYTE byClassLevels,BYTE byAttrNo,DSP::_DSPPACKET &dsp,DWORD dwLen)
{
	//反序列化对象
	if(byClassLevels>1)
		return DSPACT::UnSerialize(byClassLevels-1,byAttrNo,dsp,dwLen);
	else
	{
		switch(byAttrNo)
		{
			case 1:						//得到第1个属性
				dsp.Read(this->m_bBOOL);
				return false;
			case 2:						//得到第2个属性
				dsp.Read(this->m_bBool);
				return false;
			case 3:
				dsp.Read(this->m_dwValue);
				return false;
			case 4:
				dsp.Read(this->m_iValue);
				return false;
			case 5:
				dsp.Read(this->m_sValue);
				return false;
			case 6:
				dsp.Read(this->m_wValue);
				return false;
			case 7:
				dsp.Read(this->m_cValue);
				return false;
			case 8:
				dsp.Read(this->m_byValue);
				return false;
			case 9:
				dsp.Read(this->m_hgf);
				return false;
			case 10:
				dsp.Read(this->m_str,dwLen);
				return false;
			case 11:						//序列化最后一个属性
				dsp.Read(this->m_chBuff,dwLen);
		}
	}

	return true;
}

/*******************************************************************
接收属性的一个段
bool DSPACT::AttrSectRecv(BYTE byClassLevels,BYTE byAttrNo,const char* const lpBuff,DWORD dwLen,bool bLast)
	byClassLevels	--	类的层次
	byAttrNo		--	属性序号
	lpBuff			--	保存接收值的缓冲区
	dwLen			--	缓冲区的长度
	bLast			--	表示是否接收到的最后一个段;
						true时,表示这次接收到的数据是最后一段数据;
						false时,表示这次接收到的数据不是最后一段数据,后面还有数据。
	返回:	false时,表示失败;true时,表示正常
******************************************************************/
bool PPQ::AttrSectRecv(BYTE byClassLevels,BYTE byAttrNo,const char* const lpBuff,DWORD dwLen,bool bLast)
{
	if(byClassLevels>1)
		return DSPACT::AttrSectRecv(byClassLevels,byAttrNo,lpBuff,dwLen,bLast);
	else
	{
		switch(byAttrNo)
		{
			case 11:
				if(ofs.is_open()==0)
				{
					//如果文件没有被打开,则打开文件
					ofs.open("ip2.txt",ios::out|ios::binary);
				}
				ofs.write(lpBuff,dwLen);
				if(bLast)
				{
					ofs.flush();
					ofs.close();
				}
				break;
		}
	}

	return true;
}

/*******************************************************************
传送属性的一个段
bool DSPACT::AttrSectSend(BYTE byClassLevels,BYTE byAttrNo,char** const lpBuff,DWORD& dwLen,bool& bContinue)
	byClassLevels	--	类的层次
	byAttrNo		--	属性序号
	lpBuff			--	保存传送缓冲区的首址的变量的指针
	wLen			--	保存缓冲区的长度的变量的指针
	bContinue		--	表示是否是传送的最后一个段的变量的地址;
						true时,表示这次传送的数据是最后一段数据;
						false时,表示这次传送的数据不是最后一段数据,后面还有数据。
	返回:	false	--	表示失败;
			true	--	表示正常
******************************************************************/
bool PPQ::AttrSectSend(BYTE byClassLevels,BYTE byAttrNo,char** const lpBuff,DWORD& dwLen,bool& bContinue)
{
	if(byClassLevels>1)
		return DSPACT::AttrSectSend(byClassLevels,byAttrNo,lpBuff,dwLen,bContinue);
	else
	{
		switch(byAttrNo)
		{
			case 11:
				if(ifs.is_open()==0)
				{
					//如果文件没有被打开,则打开文件
					ifs.open("ip1.txt",ios::in|ios::binary);

					//保存接收的长度
					dwLen	=READ_FILE_SIZE;

					//保存接收的缓冲区首址
					*lpBuff	=this->m_chBuff;
				}
				ifs.read(*lpBuff,dwLen);
				if(ifs.eof())
				{
					//如果文件已经结束
					//得到文件的大小
					int size	=ifs.tellg();

					//得到最后读取的文件尺寸,设定最后接收的字节数
					dwLen		=size%dwLen;

					//设定不需要再继续接收
					bContinue	=false;

					//关闭文件
					ifs.close();
				}
				break;
		}
	}

	return true;
}

/******************************************************************
压缩
bool DSPACT::Compress(char** const lpBuff,DWORD& dwLen)
	lpBuff	--	在调用时,指向要压缩的数据缓冲区的指针,压缩后指向压缩数据的缓冲区的首址
	dwLen	--	在调用时,为要压缩的数据的字节个数,压缩后为压缩后的数据的字节数
		返回:true--压缩程序有效;false--压缩程序无效;
			当压缩有效时,必需修改lpBuff为保存压缩后数据的缓冲区的指针,
			dwLen地址内保存为压缩后的数据的长度

  			如果设定缓冲区为NULL,则表示压缩程序失败。
******************************************************************/
/*bool PPQ::Compress(char** const lpBuff,DWORD& dwLen)
{
	RADIX64::_CODER	coder;
	int size	=coder.GetEncodeLen(dwLen);
	if(this->m_lpbuff!=NULL)
		delete []this->m_lpbuff;
	this->m_lpbuff	=new char[size];
	coder.Encode(*lpBuff,dwLen,this->m_lpbuff);
	*lpBuff	=this->m_lpbuff;
	dwLen	=size;
	return true;
//	return false;
};
*/
/******************************************************************
解压缩
bool DSPACT::UnCompress(char** const lpBuff,DWORD dwLen,char* lpUnBuff,WORD& wUnLen,bool bStart)
	lpBuff	--	bStart==false时,需要将接收被压缩的数据缓冲区的首址保存在该地址中;
				bStart==true时,保存被压缩的数据缓冲区的首址
	dwLen	--	被压缩数据的缓冲区的长度
	lpUnBuff--	bStart==true时,接收解压缩数据的缓冲区的首址
	dwUnLen	--	bStart==true时,接收解压缩数据的缓冲区的长度,在解压缩完成后,保存为解压缩数据的长度
	bStart	--	true,表示可以开始进行解压缩数据;
				false,表示该次调用只是指定填充数据的缓冲区,缓冲区的长度不能小于dwLen;
		返回:true	--解压缩程序有效;
			 false	--解压缩程序无效
			如果设定缓冲区为NULL,则表示解压缩程序失败。
******************************************************************/
/*bool PPQ::UnCompress(char** const lpBuff,DWORD dwLen,char* lpUnBuff,WORD& wUnLen,bool bStart)
{
	if(bStart)
	{
		//解压缩程序
		RADIX64::_CODER	coder;
		wUnLen	=coder.GetDecodeLen(dwLen,*lpBuff);
		coder.Decode(*lpBuff,dwLen,lpUnBuff);
	}
	else
	{
		//设定解压缩程序的接收压缩数据的缓冲区的地址
		if(this->m_lpbuff!=NULL)
			delete []this->m_lpbuff;
		this->m_lpbuff	=new char[dwLen];
		*lpBuff	=this->m_lpbuff;
	}
	return true;
//	return false;
};
*/

⌨️ 快捷键说明

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