用来序列化通用的数据类型
2013-10-23 14:01
106 查看
/***********************************************************
版权声明:
文 件 名: cstandardserialize.cpp
创 建 人:
创建日期:
说 明: 用来序列化通用的数据类型
版 本 号:
修改记录: 防止内存越界
***********************************************************/
#include "stdafx.h"
#include "StandardSerialize.h"
CStandardSerialize::CStandardSerialize(char * apBuffer,long alBufLen, ENUM_TYPE abyType)
{
mpBuffer = apBuffer;
mbyType = abyType;
mlBufLen = alBufLen;
mlDataLen = 0;
}
CStandardSerialize::~CStandardSerialize()
{
}
long CStandardSerialize::getDataLen()
{
return mlDataLen;
}
int CStandardSerialize::Serialize(bool& abValue)
{
if (mlBufLen < (mlDataLen+1))
throw(-1);
if (mbyType == LOAD)//读取
{
memcpy(&abValue,mpBuffer + mlDataLen, 1);
}
else //存储
{
memcpy(mpBuffer + mlDataLen, &abValue, 1);
}
mlDataLen += 1;
return 1;
}
int CStandardSerialize::Serialize(int& aiValue)
{
if (mlBufLen < (mlDataLen+4))
throw(-1);
if (mbyType == LOAD)//读取
{
memcpy(&aiValue,mpBuffer + mlDataLen, 4);
}
else //存储
{
memcpy(mpBuffer + mlDataLen, &aiValue, 4);
}
mlDataLen += 4;
return 1;
}
int CStandardSerialize::Serialize(BYTE& abyValue)
{
if (mlBufLen < (mlDataLen+1))
throw(-1);
if (mbyType == LOAD)//读取
{
memcpy(&abyValue,mpBuffer + mlDataLen, 1);
}
else //存储
{
memcpy(mpBuffer + mlDataLen, &abyValue, 1);
}
mlDataLen += 1;
return 1;
}
/****************************************************************
函 数 名:int Serialize(short& asValue);
功能描述:序列化WORD类型的值
输入参数:WORD awValue(既可以作为输入,也可以作为输出)
输出参数:
返 回 值:int 1=成功;-1=失败(throw,有外部捕获)
创建日期:2002-5-27
创 建 者:Siwen
****************************************************************/
int CStandardSerialize::Serialize(short& asValue)
{
if (mlBufLen < (mlDataLen+2))
throw(-1);
if (mbyType == LOAD)//读取
{
memcpy(&asValue,mpBuffer + mlDataLen, 2);
}
else //存储
{
memcpy(mpBuffer + mlDataLen, &asValue, 2);
}
mlDataLen += 2;
return 1;
}
int CStandardSerialize::Serialize(WORD& awValue)
{
if (mlBufLen < (mlDataLen+2))
throw(-1);
if (mbyType == LOAD)//读取
{
memcpy(&awValue,mpBuffer + mlDataLen, 2);
}
else //存储
{
memcpy(mpBuffer + mlDataLen, &awValue, 2);
}
mlDataLen += 2;
return 1;
}
int CStandardSerialize::Serialize(long& alValue)
{
if (mlBufLen < (mlDataLen+4))
throw(-1);
if (mbyType == LOAD)//读取
{
memcpy(&alValue,mpBuffer + mlDataLen, 4);
}
else //存储
{
memcpy(mpBuffer + mlDataLen, &alValue, 4);
}
mlDataLen += 4;
return 1;
}
int CStandardSerialize::Serialize(unsigned long& aulValue)
{
if (mlBufLen < (mlDataLen+4))
throw(-1);
if (mbyType == LOAD)//读取
{
memcpy(&aulValue,mpBuffer + mlDataLen, 4);
}
else //存储
{
memcpy(mpBuffer + mlDataLen, &aulValue, 4);
}
mlDataLen += 4;
return 1;
}
int CStandardSerialize::Serialize(__int64& aiValue)
{
if (mlBufLen < (mlDataLen+8))
throw(-1);
if (mbyType == LOAD)//读取
{
memcpy(&aiValue,mpBuffer + mlDataLen, 8);
}
else //存储
{
memcpy(mpBuffer + mlDataLen, &aiValue, 8);
}
mlDataLen += 8;
return 1;
}
/*
int CStandardSerialize::Serialize(GUID& aGuidValue)
{
if (mlBufLen < (mlDataLen+16))
throw(-1);
if (mbyType == LOAD)//读取
{
long * lpLongBuffer;
WORD * lpWordBuffer;
lpLongBuffer = (long *)(mpBuffer + mlDataLen);
aGuidValue.Data1 = lpLongBuffer[0];
mlDataLen += 4;
lpWordBuffer = (WORD *)(mpBuffer + mlDataLen);
aGuidValue.Data2 = lpWordBuffer[0];
mlDataLen += 2;
lpWordBuffer = (WORD *)(mpBuffer + mlDataLen);
aGuidValue.Data3 = lpWordBuffer[0];
mlDataLen += 2;
memcpy(aGuidValue.Data4, mpBuffer+mlDataLen, 8);
mlDataLen += 8;
}
else //存储
{
memcpy(mpBuffer + mlDataLen, &(aGuidValue.Data1), 4);
mlDataLen += 4;
memcpy(mpBuffer+mlDataLen, &(aGuidValue.Data2), 2);
mlDataLen += 2;
memcpy(mpBuffer+mlDataLen, &(aGuidValue.Data3), 2);
mlDataLen += 2;
memcpy(mpBuffer + mlDataLen, aGuidValue.Data4, 8);
mlDataLen += 8;
}
return 1;
}
*/
//*****************************************************************************
// 函数: 序列化以0结尾的字符串数据
// 参数: char * apValue 字符串数据
// WORD awBufferLen 容纳此字符串数据的缓存区大小
// 返回值:int 1= 成功; -1 = 失败
// 用法:
//*****************************************************************************
int CStandardSerialize::Serialize(char * apValue,WORD awMaxLen)
{
if (mlBufLen < (mlDataLen+2))
throw(-1);
WORD lwLen = 0;
if (mbyType == LOAD) //读取
{
//首先读取长度
memcpy(&lwLen,mpBuffer + mlDataLen, 2);
mlDataLen += 2;
//读取数据本身
if ((lwLen >= awMaxLen) || ((mlDataLen+lwLen) > mlBufLen))
{
throw(-1);
}
memcpy(apValue, mpBuffer + mlDataLen, lwLen);
apValue[lwLen] = '\0';
mlDataLen += lwLen;
}
else //存储
{
//首先存储长度
lwLen = strlen(apValue);
if ((lwLen >= awMaxLen) || (lwLen+mlDataLen+2 > mlBufLen))
throw(-1);
memcpy(mpBuffer+mlDataLen, &lwLen, 2);
mlDataLen += 2;
//存储数据本身
memcpy(mpBuffer+mlDataLen, apValue, lwLen);
mlDataLen += lwLen;
}
return 1;
}
//*****************************************************************************
// 函数: 序列化数据
// 参数: char * apValue 数据
// WORD& awLen 此数据的真正长度
// WORD awBufferLen 容纳此数据的缓存区大小
// 返回值:int 1= 成功; -1 = 失败
// 用法:
//*****************************************************************************
int CStandardSerialize::Serialize(char * apValue, WORD awLen,WORD aiBufferLen)
{
if ((awLen > aiBufferLen) || (mlBufLen < (mlDataLen+awLen)))
throw (-1);
if (mbyType == LOAD) //读取
{
//因为外部制定了读取长度,所以不需要对数据长度进行序列化
memcpy(apValue, mpBuffer + mlDataLen, awLen);
}
else //存储数据本身
{
memcpy(mpBuffer+mlDataLen, apValue, awLen);
}
mlDataLen += awLen;
return 1;
}
版权声明:
文 件 名: cstandardserialize.cpp
创 建 人:
创建日期:
说 明: 用来序列化通用的数据类型
版 本 号:
修改记录: 防止内存越界
***********************************************************/
#include "stdafx.h"
#include "StandardSerialize.h"
CStandardSerialize::CStandardSerialize(char * apBuffer,long alBufLen, ENUM_TYPE abyType)
{
mpBuffer = apBuffer;
mbyType = abyType;
mlBufLen = alBufLen;
mlDataLen = 0;
}
CStandardSerialize::~CStandardSerialize()
{
}
long CStandardSerialize::getDataLen()
{
return mlDataLen;
}
int CStandardSerialize::Serialize(bool& abValue)
{
if (mlBufLen < (mlDataLen+1))
throw(-1);
if (mbyType == LOAD)//读取
{
memcpy(&abValue,mpBuffer + mlDataLen, 1);
}
else //存储
{
memcpy(mpBuffer + mlDataLen, &abValue, 1);
}
mlDataLen += 1;
return 1;
}
int CStandardSerialize::Serialize(int& aiValue)
{
if (mlBufLen < (mlDataLen+4))
throw(-1);
if (mbyType == LOAD)//读取
{
memcpy(&aiValue,mpBuffer + mlDataLen, 4);
}
else //存储
{
memcpy(mpBuffer + mlDataLen, &aiValue, 4);
}
mlDataLen += 4;
return 1;
}
int CStandardSerialize::Serialize(BYTE& abyValue)
{
if (mlBufLen < (mlDataLen+1))
throw(-1);
if (mbyType == LOAD)//读取
{
memcpy(&abyValue,mpBuffer + mlDataLen, 1);
}
else //存储
{
memcpy(mpBuffer + mlDataLen, &abyValue, 1);
}
mlDataLen += 1;
return 1;
}
/****************************************************************
函 数 名:int Serialize(short& asValue);
功能描述:序列化WORD类型的值
输入参数:WORD awValue(既可以作为输入,也可以作为输出)
输出参数:
返 回 值:int 1=成功;-1=失败(throw,有外部捕获)
创建日期:2002-5-27
创 建 者:Siwen
****************************************************************/
int CStandardSerialize::Serialize(short& asValue)
{
if (mlBufLen < (mlDataLen+2))
throw(-1);
if (mbyType == LOAD)//读取
{
memcpy(&asValue,mpBuffer + mlDataLen, 2);
}
else //存储
{
memcpy(mpBuffer + mlDataLen, &asValue, 2);
}
mlDataLen += 2;
return 1;
}
int CStandardSerialize::Serialize(WORD& awValue)
{
if (mlBufLen < (mlDataLen+2))
throw(-1);
if (mbyType == LOAD)//读取
{
memcpy(&awValue,mpBuffer + mlDataLen, 2);
}
else //存储
{
memcpy(mpBuffer + mlDataLen, &awValue, 2);
}
mlDataLen += 2;
return 1;
}
int CStandardSerialize::Serialize(long& alValue)
{
if (mlBufLen < (mlDataLen+4))
throw(-1);
if (mbyType == LOAD)//读取
{
memcpy(&alValue,mpBuffer + mlDataLen, 4);
}
else //存储
{
memcpy(mpBuffer + mlDataLen, &alValue, 4);
}
mlDataLen += 4;
return 1;
}
int CStandardSerialize::Serialize(unsigned long& aulValue)
{
if (mlBufLen < (mlDataLen+4))
throw(-1);
if (mbyType == LOAD)//读取
{
memcpy(&aulValue,mpBuffer + mlDataLen, 4);
}
else //存储
{
memcpy(mpBuffer + mlDataLen, &aulValue, 4);
}
mlDataLen += 4;
return 1;
}
int CStandardSerialize::Serialize(__int64& aiValue)
{
if (mlBufLen < (mlDataLen+8))
throw(-1);
if (mbyType == LOAD)//读取
{
memcpy(&aiValue,mpBuffer + mlDataLen, 8);
}
else //存储
{
memcpy(mpBuffer + mlDataLen, &aiValue, 8);
}
mlDataLen += 8;
return 1;
}
/*
int CStandardSerialize::Serialize(GUID& aGuidValue)
{
if (mlBufLen < (mlDataLen+16))
throw(-1);
if (mbyType == LOAD)//读取
{
long * lpLongBuffer;
WORD * lpWordBuffer;
lpLongBuffer = (long *)(mpBuffer + mlDataLen);
aGuidValue.Data1 = lpLongBuffer[0];
mlDataLen += 4;
lpWordBuffer = (WORD *)(mpBuffer + mlDataLen);
aGuidValue.Data2 = lpWordBuffer[0];
mlDataLen += 2;
lpWordBuffer = (WORD *)(mpBuffer + mlDataLen);
aGuidValue.Data3 = lpWordBuffer[0];
mlDataLen += 2;
memcpy(aGuidValue.Data4, mpBuffer+mlDataLen, 8);
mlDataLen += 8;
}
else //存储
{
memcpy(mpBuffer + mlDataLen, &(aGuidValue.Data1), 4);
mlDataLen += 4;
memcpy(mpBuffer+mlDataLen, &(aGuidValue.Data2), 2);
mlDataLen += 2;
memcpy(mpBuffer+mlDataLen, &(aGuidValue.Data3), 2);
mlDataLen += 2;
memcpy(mpBuffer + mlDataLen, aGuidValue.Data4, 8);
mlDataLen += 8;
}
return 1;
}
*/
//*****************************************************************************
// 函数: 序列化以0结尾的字符串数据
// 参数: char * apValue 字符串数据
// WORD awBufferLen 容纳此字符串数据的缓存区大小
// 返回值:int 1= 成功; -1 = 失败
// 用法:
//*****************************************************************************
int CStandardSerialize::Serialize(char * apValue,WORD awMaxLen)
{
if (mlBufLen < (mlDataLen+2))
throw(-1);
WORD lwLen = 0;
if (mbyType == LOAD) //读取
{
//首先读取长度
memcpy(&lwLen,mpBuffer + mlDataLen, 2);
mlDataLen += 2;
//读取数据本身
if ((lwLen >= awMaxLen) || ((mlDataLen+lwLen) > mlBufLen))
{
throw(-1);
}
memcpy(apValue, mpBuffer + mlDataLen, lwLen);
apValue[lwLen] = '\0';
mlDataLen += lwLen;
}
else //存储
{
//首先存储长度
lwLen = strlen(apValue);
if ((lwLen >= awMaxLen) || (lwLen+mlDataLen+2 > mlBufLen))
throw(-1);
memcpy(mpBuffer+mlDataLen, &lwLen, 2);
mlDataLen += 2;
//存储数据本身
memcpy(mpBuffer+mlDataLen, apValue, lwLen);
mlDataLen += lwLen;
}
return 1;
}
//*****************************************************************************
// 函数: 序列化数据
// 参数: char * apValue 数据
// WORD& awLen 此数据的真正长度
// WORD awBufferLen 容纳此数据的缓存区大小
// 返回值:int 1= 成功; -1 = 失败
// 用法:
//*****************************************************************************
int CStandardSerialize::Serialize(char * apValue, WORD awLen,WORD aiBufferLen)
{
if ((awLen > aiBufferLen) || (mlBufLen < (mlDataLen+awLen)))
throw (-1);
if (mbyType == LOAD) //读取
{
//因为外部制定了读取长度,所以不需要对数据长度进行序列化
memcpy(apValue, mpBuffer + mlDataLen, awLen);
}
else //存储数据本身
{
memcpy(mpBuffer+mlDataLen, apValue, awLen);
}
mlDataLen += awLen;
return 1;
}
相关文章推荐
- C语言通用数据类型链表的实现,(数据域为指针,可指向任意类型数据)
- DateTime数据类型的XML序列化及时区问题
- javaScript通用数据类型校验
- SESSION信息保存在哪个文件目录下以及能够用来保存什么类型的数据
- 结合手机上网流量业务来说明Hadoop中的自定义数据类型(序列化、反序列化机制)
- 用js解析经json序列化后的C#的DateTime类型数据
- javaScript通用数据类型校验
- JavaScriptSerializer 对 DateTime 数据类型的JSON序列化的问题
- ASP.NET AJAX客户端编程之旅(三)——让JavaScript和C#无障碍沟通:数据类型自动转换&序列化
- javaScript通用数据类型校验
- ASP.NET AJAX客户端编程之旅(三)——让JavaScript和C#无障碍沟通:数据类型自动转换&序列化
- javaScript通用数据类型校验
- 在使用Linq to SQL并序列化一个数据对象的时候报System.InvalidOperationException异常,序列化类型XXX的对象时检测到循环引用。
- toString()方法,与call()方法结合;用来进行数据类型检测
- VB6各数据类型序列化和反序列化
- javaScript通用数据类型校验2
- 将表单序列化类型的数据转化成对象的处理(允许对象中包含对象)
- JavaScriptSerializer 对 DateTime 数据类型的JSON序列化的问题
- InnerException 消息是“反序列化对象 属于类型 *** 时出现错误。读取 XML 数据时,超出最大字符串内容长度配额 (8192)。(注意细节)
- 数据 序列化和反序列化 通用方法