#include "StdAfx.h" #include "PduDataFormatOne.h" CPduDataFormatOne::CPduDataFormatOne(PDU_CMD_TYPE a_nCmdType) { m_nCmdType = a_nCmdType; ZeroMemory(m_pDataMemoArray, PDU_CMD_MAX_DATA_COUNT*sizeof(long)); // 初始化 } CPduDataFormatOne::~CPduDataFormatOne(void) { for(int i=0; i= PDU_CMD_MAX_DATA_COUNT || m_pDataMemoArray[nIndex] != NULL) { ASSERT(FALSE); return; } // end if // 生成数据 PduDataMemo* pDataMemo = new PduDataMemo; ZeroMemory(pDataMemo, sizeof(PduDataMemo)); CHAR szSteps[] = "|"; CHAR* lpNextToken = NULL; // 数据类型 CHAR* lpToken = strtok_s(lpDataString, szSteps, &lpNextToken); if(lpToken == NULL) ASSERT(FALSE); sscanf_s(lpToken, "%d", &pDataMemo->nDataType); // 数据长度 lpToken = strtok_s(NULL, szSteps, &lpNextToken); if(lpToken == NULL) ASSERT(FALSE); sscanf_s(lpToken, "%d", &pDataMemo->nDataLen); // 数据描述 lpToken = strtok_s(NULL, szSteps, &lpNextToken); if(lpToken == NULL) ASSERT(FALSE); lstrcpy(pDataMemo->szExplain, lpToken); // 是否执行结果返回数据 lpToken = strtok_s(NULL, szSteps, &lpNextToken); if(lpToken == NULL) ASSERT(FALSE); sscanf_s(lpToken, "%d", &pDataMemo->nIsExecReturn); // 初始化数据内容 lstrcpy(pDataMemo->szValue, ""); // 赋值 m_pDataMemoArray[nIndex] = pDataMemo; } /***************************************************************** **【函数名称】 IncodeData **【函数功能】 打包数据串 **【参数】 **【返回值】 a_pData 打包后的数据内容 USHORT 打包后的数据长度 ****************************************************************/ USHORT CPduDataFormatOne::IncodeData(CHAR* a_pData) { USHORT nDataLen = 0; for(int i=0; iszValue); } else { strcat_s(a_pData, PDU_MAX_DATA_LEN, m_pDataMemoArray[i]->szValue); } // end if strcat_s(a_pData, PDU_MAX_DATA_LEN, "\t"); nDataLen = nDataLen + strlen(m_pDataMemoArray[i]->szValue) + 1; } // end for return nDataLen; } /***************************************************************** **【函数名称】 DecodeData **【函数功能】 解包数据 **【参数】 a_pData 要解包的原始数据串 **【返回值】 USHORT 解包后的数据字段个数 ****************************************************************/ USHORT CPduDataFormatOne::DecodeData(CHAR* a_pData) { int nCount = 0; CHAR* lpTop = a_pData; while(lpTop != NULL) { CHAR* lpNext = strstr(lpTop, "\t"); if(lpNext == NULL) break; if(m_pDataMemoArray[nCount] == NULL) break; memcpy(m_pDataMemoArray[nCount]->szValue, lpTop, lpNext - lpTop); lpTop = lpNext + 1; nCount++;; } // end while return nCount; } /***************************************************************** **【函数名称】 GetData **【函数功能】 读取指定索引的数据 **【参数】 a_nIndex 数据索引 a_nDataType 数据类型 **【返回值】 szData 数据内容 读取是否成功 ****************************************************************/ BOOL CPduDataFormatOne::GetData(int a_nIndex, int a_nDataType, CHAR szData[]) { // 校验 if(a_nIndex >= PDU_CMD_MAX_DATA_COUNT) return FALSE; if(m_pDataMemoArray[a_nIndex] == NULL) return FALSE; if(m_pDataMemoArray[a_nIndex]->nDataType != a_nDataType) return FALSE; // 返回数据 lstrcpy(szData, m_pDataMemoArray[a_nIndex]->szValue); return TRUE; } /***************************************************************** **【函数名称】 SetData **【函数功能】 设置指定索引的数据 **【参数】 a_nIndex 数据索引 a_nDataType 数据类型 szData 数据内容 **【返回值】 写入是否成功 ****************************************************************/ BOOL CPduDataFormatOne::SetData(int a_nIndex, int a_nDataType, LPCTSTR szData) { // 校验 if(a_nIndex >= PDU_CMD_MAX_DATA_COUNT) return FALSE; if(m_pDataMemoArray[a_nIndex] == NULL) return FALSE; if(m_pDataMemoArray[a_nIndex]->nDataType != a_nDataType) return FALSE; // 返回数据 lstrcpy(m_pDataMemoArray[a_nIndex]->szValue, szData); return TRUE; }