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