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

📄 fwpackdata.cpp

📁 一个用HLA编写的聊天程序
💻 CPP
字号:
//CFWPackData.cpp: the implementation of the CFWPackData class
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "FWPackData.h"

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

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////

CFWPackData::CFWPackData()
{
	pOutBuffer = NULL;
	offset = 0;
	sizeOfData = 0;
	curSize = 0;
}

CFWPackData::~CFWPackData()
{
	for(int i = 0; i < BufferArray.size(); i++) {
		char* buffer = (char*)BufferArray[i];
		if(NULL != buffer) {
			delete[] buffer;
			buffer = NULL;
		}
	}
	BufferArray.clear();
	usedSize.clear();
	if(NULL != pOutBuffer) {
		delete[] pOutBuffer;
		pOutBuffer = NULL;
	}
}

void CFWPackData::PackBasicData(void *packData, unsigned long lenOfData)
{
	if(IfReAlloc(lenOfData)) {
		ReAllocBuffer(lenOfData);
	}

	memcpy(pCurBuffer, packData, lenOfData);
	pCurBuffer += lenOfData;
	offset += lenOfData;
}

char* CFWPackData::PackStringData(std::string packData)
{
	unsigned long numOfData = 0;
	char* charbuffer = NULL;

	numOfData = packData.size();
	charbuffer = new char[numOfData + 1];
	memset(charbuffer, 0, numOfData + 1);
	packData.copy(charbuffer, numOfData);
	ClearPack();
	PackBasicData(charbuffer, numOfData + 1);
	delete[] charbuffer;
	charbuffer = NULL;
	SaveDirty();
	
	return GetBufData();
}

char* CFWPackData::PackMulStringData(std::vector<std::string> packData)
{
	unsigned long num = 0;
	unsigned long numOfData = 0;
	char* charbuffer = NULL;

	ClearPack();
	num = packData.size();
	for(int k = 0; k < num; k++){
		std::string str;
		str = packData[k];
		numOfData = str.size();
		charbuffer = new char[numOfData + 1];
		memset(charbuffer, 0, numOfData + 1);
		str.copy(charbuffer, numOfData);
		PackBasicData(charbuffer, numOfData + 1);
		delete[] charbuffer;
		charbuffer = NULL;
	}
	SaveDirty();

	return GetBufData();
}

void CFWPackData::UnpackMulStringData(char *in, std::vector<std::string> &unpackData, unsigned long lenOfData)
{
	unsigned long num = 0;
	unsigned long offsetOfData = 0;
	char* charbuffer = NULL;
	char* strbuffer = NULL;

	strbuffer = new char[lenOfData];
	charbuffer = in;
	if(charbuffer != NULL) {
		while(offsetOfData < lenOfData) {
			if(charbuffer[offsetOfData] == '\0')
				num++;
			offsetOfData++;
		}
		unpackData.resize(num);
		for(int k = 0; k < num; k++){
			strcpy(strbuffer, charbuffer);
			unpackData[k] = strbuffer;
			charbuffer += strlen(strbuffer) + 1;
		}
		delete[] strbuffer;
		strbuffer = NULL;
	}
}

char* CFWPackData::PackMulStringData(std::string packData[], unsigned long num)
{
	unsigned long numOfData = 0;
	char* charbuffer = NULL;

	ClearPack();
	for(int k = 0; k < num; k++){
		std::string str;
		str = packData[k];
		numOfData = str.size();
		charbuffer = new char[numOfData + 1];
		memset(charbuffer, 0, numOfData + 1);
		str.copy(charbuffer, numOfData);
		PackBasicData(charbuffer, numOfData + 1);
		delete[] charbuffer;
		charbuffer = NULL;
	}
	SaveDirty();

	return GetBufData();
}

void CFWPackData::UnpackMulStringData(char *in, std::string unpackData[], unsigned long lenOfData, unsigned long num)
{
	unsigned long numOfData = 0;
	unsigned long offsetOfData = 0;
	char* charbuffer = NULL;
	char* strbuffer = NULL;

	strbuffer = new char[lenOfData];
	charbuffer = in;
	if(charbuffer != NULL) {
		for(int k = 0; k < num; k++){
			strcpy(strbuffer, charbuffer);
			unpackData[k] = strbuffer;
			charbuffer += strlen(strbuffer) + 1;
		}
		delete[] strbuffer;
		strbuffer = NULL;
	}
}

void CFWPackData::UnpackBasicData(char *in, void *unpackData, unsigned long lenOfData)
{
	in += offset;
	memcpy(unpackData, in, lenOfData);
	offset += lenOfData;
}

void CFWPackData::ReAllocBuffer(unsigned long lenOfData)
{
	if(0 != offset) {
		usedSize.push_back(offset);
	}
	int num = lenOfData / sizeOfBuffer + 1;
	curSize = num * sizeOfBuffer;
	pCurBuffer = new char[curSize];
	BufferArray.push_back(pCurBuffer);
	offset = 0;
}

bool CFWPackData::IfReAlloc(unsigned long lenOfData)
{
	bool reAllocFlag = false;
	unsigned long needSize = 0;

	needSize = offset + lenOfData;
	if(needSize > curSize) {
		reAllocFlag = true;
	}

	return reAllocFlag;
}

void CFWPackData::ClearPack()
{
	for(int i = 0; i < BufferArray.size(); i++) {
		char* buffer = (char*)BufferArray[i];
		if(NULL != buffer) {
			delete[] buffer;
			buffer = NULL;
		}
	}
	BufferArray.clear();
	usedSize.clear();
	i = BufferArray.size();
	i = usedSize.size();
	if(NULL != pOutBuffer) {
		delete[] pOutBuffer;
		pOutBuffer = NULL;
	}

	offset = 0;
	sizeOfData = 0;
	curSize = 0;
}

char* CFWPackData::GetBufData()
{
	GetDirtySize();
	pOutBuffer = new char[sizeOfData];

	for(int i = 0; i < BufferArray.size(); i++) 
	{
		memcpy(pOutBuffer, BufferArray[i], usedSize[i]);
		pOutBuffer += usedSize[i];
	}
	pOutBuffer -= sizeOfData;

	return pOutBuffer;
}

unsigned long CFWPackData::GetDirtySize()
{
	sizeOfData = 0;
	for(int i = 0; i < usedSize.size(); i++)
	{
		sizeOfData += usedSize[i];
	}

	return sizeOfData;
}

void CFWPackData::SaveDirty()
{
	usedSize.push_back(offset);
}

⌨️ 快捷键说明

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