用来序列化通用的数据类型

  1. /***********************************************************  
  2. 版权声明:
  3. 文 件 名:  cstandardserialize.cpp  
  4. 创 建 人:    
  5. 创建日期:     
  6. 说    明: 用来序列化通用的数据类型  
  7. 版 本 号:  
  8. 修改记录: 防止内存越界  
  9. ***********************************************************/   
  10. #include "stdafx.h"   
  11. #include "StandardSerialize.h"   
  12.    
  13.    
  14. CStandardSerialize::CStandardSerialize(char * apBuffer,long alBufLen, ENUM_TYPE abyType)   
  15. {   
  16.     mpBuffer = apBuffer;   
  17.     mbyType  = abyType;   
  18.     mlBufLen = alBufLen;   
  19.     mlDataLen = 0;   
  20. }   
  21.    
  22. CStandardSerialize::~CStandardSerialize()   
  23. {   
  24. }   
  25.    
  26. long CStandardSerialize::getDataLen()   
  27. {   
  28.     return mlDataLen;   
  29. }   
  30.    
  31. int CStandardSerialize::Serialize(bool& abValue)   
  32. {   
  33.     if (mlBufLen < (mlDataLen+1))   
  34.         throw(-1);   
  35.    
  36.     if (mbyType == LOAD)//读取   
  37.     {      
  38.         memcpy(&abValue,mpBuffer + mlDataLen, 1);                  
  39.     }   
  40.     else                //存储   
  41.     {   
  42.         memcpy(mpBuffer + mlDataLen, &abValue, 1);   
  43.     }   
  44.     mlDataLen += 1;   
  45.    
  46.     return 1;   
  47. }   
  48.    
  49.    
  50. int CStandardSerialize::Serialize(int&  aiValue)   
  51. {   
  52.     if (mlBufLen < (mlDataLen+4))   
  53.         throw(-1);   
  54.    
  55.     if (mbyType == LOAD)//读取   
  56.     {      
  57.         memcpy(&aiValue,mpBuffer + mlDataLen, 4);                  
  58.     }   
  59.     else                //存储   
  60.     {   
  61.         memcpy(mpBuffer + mlDataLen, &aiValue, 4);   
  62.     }   
  63.     mlDataLen += 4;   
  64.     return 1;   
  65. }   
  66.    
  67. int CStandardSerialize::Serialize(BYTE& abyValue)   
  68. {   
  69.     if (mlBufLen < (mlDataLen+1))   
  70.         throw(-1);   
  71.    
  72.     if (mbyType == LOAD)//读取   
  73.     {      
  74.         memcpy(&abyValue,mpBuffer + mlDataLen, 1);                 
  75.     }   
  76.     else                //存储   
  77.     {   
  78.         memcpy(mpBuffer + mlDataLen, &abyValue, 1);   
  79.     }   
  80.     mlDataLen += 1;   
  81.     return 1;      
  82. }   
  83.    
  84.    
  85. /****************************************************************  
  86. 函 数 名:int   Serialize(short&    asValue);  
  87. 功能描述:序列化WORD类型的值  
  88. 输入参数:WORD awValue(既可以作为输入,也可以作为输出)  
  89. 输出参数:  
  90. 返 回 值:int 1=成功;-1=失败(throw,有外部捕获)  
  91. 创建日期:2002-5-27  
  92. 创 建 者:Siwen  
  93. ****************************************************************/   
  94. int CStandardSerialize::Serialize(short& asValue)   
  95. {   
  96.     if (mlBufLen < (mlDataLen+2))   
  97.         throw(-1);   
  98.    
  99.     if (mbyType == LOAD)//读取   
  100.     {      
  101.         memcpy(&asValue,mpBuffer + mlDataLen, 2);   
  102.     }   
  103.     else                //存储   
  104.     {   
  105.         memcpy(mpBuffer + mlDataLen, &asValue, 2);   
  106.     }   
  107.     mlDataLen += 2;   
  108.     return 1;   
  109.    
  110. }   
  111.    
  112. int CStandardSerialize::Serialize(WORD& awValue)   
  113. {   
  114.     if (mlBufLen < (mlDataLen+2))   
  115.         throw(-1);   
  116.    
  117.     if (mbyType == LOAD)//读取   
  118.     {      
  119.         memcpy(&awValue,mpBuffer + mlDataLen, 2);   
  120.     }   
  121.     else                //存储   
  122.     {   
  123.         memcpy(mpBuffer + mlDataLen, &awValue, 2);   
  124.     }   
  125.     mlDataLen += 2;   
  126.     return 1;   
  127. }   
  128.    
  129. int CStandardSerialize::Serialize(long& alValue)   
  130. {   
  131.     if (mlBufLen < (mlDataLen+4))   
  132.         throw(-1);   
  133.    
  134.     if (mbyType == LOAD)//读取   
  135.     {      
  136.         memcpy(&alValue,mpBuffer + mlDataLen, 4);                  
  137.     }   
  138.     else                //存储   
  139.     {   
  140.         memcpy(mpBuffer + mlDataLen, &alValue, 4);   
  141.     }   
  142.     mlDataLen += 4;   
  143.     return 1;   
  144. }   
  145.    
  146. int CStandardSerialize::Serialize(unsigned long&    aulValue)   
  147. {   
  148.     if (mlBufLen < (mlDataLen+4))   
  149.         throw(-1);   
  150.    
  151.     if (mbyType == LOAD)//读取   
  152.     {      
  153.         memcpy(&aulValue,mpBuffer + mlDataLen, 4);                 
  154.     }   
  155.     else                //存储   
  156.     {   
  157.         memcpy(mpBuffer + mlDataLen, &aulValue, 4);   
  158.     }   
  159.     mlDataLen += 4;   
  160.    
  161.     return 1;   
  162. }   
  163.    
  164. int CStandardSerialize::Serialize(__int64&  aiValue)   
  165. {      
  166.     if (mlBufLen < (mlDataLen+8))   
  167.         throw(-1);   
  168.    
  169.     if (mbyType == LOAD)//读取   
  170.     {      
  171.         memcpy(&aiValue,mpBuffer + mlDataLen, 8);                  
  172.     }   
  173.     else                //存储   
  174.     {   
  175.         memcpy(mpBuffer + mlDataLen, &aiValue, 8);   
  176.     }   
  177.     mlDataLen += 8;   
  178.    
  179.     return 1;   
  180. }   
  181.    
  182. /*  
  183. int CStandardSerialize::Serialize(GUID& aGuidValue)  
  184.  
  185.     if (mlBufLen < (mlDataLen+16))  
  186.         throw(-1);  
  187.   
  188.     if (mbyType == LOAD)//读取  
  189.     {     
  190.         long *  lpLongBuffer;  
  191.         WORD *  lpWordBuffer;  
  192.         lpLongBuffer = (long *)(mpBuffer + mlDataLen);  
  193.         aGuidValue.Data1 = lpLongBuffer[0];  
  194.         mlDataLen += 4;  
  195.         lpWordBuffer = (WORD *)(mpBuffer + mlDataLen);  
  196.         aGuidValue.Data2 = lpWordBuffer[0];  
  197.         mlDataLen += 2;  
  198.         lpWordBuffer = (WORD *)(mpBuffer + mlDataLen);  
  199.         aGuidValue.Data3 = lpWordBuffer[0];  
  200.         mlDataLen += 2;  
  201.         memcpy(aGuidValue.Data4, mpBuffer+mlDataLen, 8);  
  202.         mlDataLen += 8;         
  203.     }  
  204.     else                //存储  
  205.     {  
  206.         memcpy(mpBuffer + mlDataLen, &(aGuidValue.Data1), 4);  
  207.         mlDataLen += 4;  
  208.         memcpy(mpBuffer+mlDataLen, &(aGuidValue.Data2), 2);  
  209.         mlDataLen += 2;  
  210.         memcpy(mpBuffer+mlDataLen, &(aGuidValue.Data3), 2);  
  211.         mlDataLen += 2;  
  212.         memcpy(mpBuffer + mlDataLen, aGuidValue.Data4, 8);  
  213.         mlDataLen += 8;  
  214.     }          
  215.   
  216.     return 1;  
  217.  
  218. */   
  219. //*****************************************************************************   
  220. //  函数:  序列化以0结尾的字符串数据   
  221. //  参数:  char * apValue     字符串数据   
  222. //          WORD awBufferLen    容纳此字符串数据的缓存区大小   
  223. //  返回值:int  1= 成功; -1 = 失败   
  224. //  用法:    
  225. //*****************************************************************************   
  226. int CStandardSerialize::Serialize(char * apValue,WORD awMaxLen)   
  227. {   
  228.     if (mlBufLen < (mlDataLen+2))   
  229.         throw(-1);   
  230.    
  231.     WORD    lwLen = 0;   
  232.     if (mbyType == LOAD)    //读取   
  233.     {   
  234.         //首先读取长度   
  235.         memcpy(&lwLen,mpBuffer + mlDataLen, 2);   
  236.         mlDataLen += 2;   
  237.    
  238.         //读取数据本身   
  239.         if ((lwLen >= awMaxLen) || ((mlDataLen+lwLen) > mlBufLen))   
  240.         {   
  241.             throw(-1);   
  242.         }   
  243.         memcpy(apValue, mpBuffer + mlDataLen, lwLen);   
  244.         apValue[lwLen] = '';   
  245.         mlDataLen += lwLen;                   
  246.     }   
  247.     else    //存储   
  248.     {           
  249.         //首先存储长度   
  250.         lwLen = strlen(apValue);   
  251.         if ((lwLen >= awMaxLen) || (lwLen+mlDataLen+2 > mlBufLen))   
  252.             throw(-1);   
  253.    
  254.         memcpy(mpBuffer+mlDataLen, &lwLen, 2);   
  255.         mlDataLen += 2;   
  256.    
  257.         //存储数据本身   
  258.         memcpy(mpBuffer+mlDataLen, apValue, lwLen);   
  259.         mlDataLen += lwLen;               
  260.     }          
  261.     return 1;      
  262. }   
  263.    
  264. //*****************************************************************************   
  265. //  函数:  序列化数据   
  266. //  参数:  char * apValue     数据   
  267. //          WORD& awLen         此数据的真正长度   
  268. //          WORD awBufferLen    容纳此数据的缓存区大小   
  269. //  返回值:int  1= 成功; -1 = 失败   
  270. //  用法:    
  271. //*****************************************************************************   
  272. int CStandardSerialize::Serialize(char * apValue, WORD awLen,WORD aiBufferLen)   
  273. {   
  274.     if ((awLen > aiBufferLen) || (mlBufLen < (mlDataLen+awLen)))   
  275.         throw (-1);   
  276.    
  277.     if (mbyType == LOAD)    //读取   
  278.     {              
  279.         //因为外部制定了读取长度,所以不需要对数据长度进行序列化   
  280.         memcpy(apValue, mpBuffer + mlDataLen, awLen);               
  281.     }   
  282.     else    //存储数据本身   
  283.     {               
  284.         memcpy(mpBuffer+mlDataLen, apValue, awLen);                           
  285.     }      
  286.     mlDataLen += awLen;   
  287.     return 1;      
  288. }   
原文地址:https://www.cnblogs.com/hzcya1995/p/13318623.html