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