123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290 |
- // stdafx.cpp : 只包括标准包含文件的源文件
- // Demo.pch 将作为预编译头
- // stdafx.obj 将包含预编译类型信息
- #include "stdafx.h"
- // TODO: 在 STDAFX.H 中
- // 引用任何所需的附加头文件,而不是在此文件中引用
- bool parse_key(std::string &RetValue, std::string strLine, TCHAR *lpszText)
- {
- TCHAR szText[MAX_PATH] = {0};
- TCHAR szValue[MAX_PATH] = {0};
- // 去除空格;
- #if _MSC_VER > 1900
- strLine.erase(std::remove_if(strLine.begin(), strLine.end(), [](unsigned char x) {return std::isspace(x); }), strLine.end()); //C++17
- #else
- for (std::string::iterator it = strLine.begin(); it != strLine.end();) {
- !isspace(*it) ? it++ : it = it = strLine.erase(it);
- }
- #endif
- #if _MSC_VER >= 1200 && _MSC_VER < 1500 // VC6.0~8.0
- if ( 2 == sscanf(strLine.c_str(), _T("%[^=]=%s"), szText, MAX_PATH, szValue, MAX_PATH) )
- #else
- if ( 2 == _stscanf_s(strLine.c_str(), _T("%[^=]=%s"), szText, MAX_PATH, szValue, MAX_PATH) )
- #endif
- {
- if ( _tcsstr(szText, lpszText) )
- {
- RetValue = szValue;
- return true;
- }
- }
- return false;
- }
- // 计算时间;
- // 如: 100ms 100m 100s
- int pares_time_value(std::string strTime)
- {
- int nTimes = 0;
- #if _MSC_VER >= 1200 && _MSC_VER < 1500
- if ( strstr(strTime.c_str(), _T("ms")) || strstr(strTime.c_str(), _T("MS")))
- {
- nTimes = atol(strTime.c_str());
- }
- else if (strstr(strTime.c_str(), _T("s")) || strstr(strTime.c_str(), _T("S")))
- {
- nTimes = atol(strTime.c_str()) * 1000;
- }
- else if (strstr(strTime.c_str(), _T("m")) || strstr(strTime.c_str(), _T("M")))
- {
- nTimes = atol(strTime.c_str()) * 6000;
- }
- else
- {
- // 不带单位或其他的,默认ms;
- nTimes = atol(strTime.c_str());
- }
- #endif
- #if _MSC_VER >= 1500
- if ( _tcsstr(strTime.c_str(), _T("ms")) || _tcsstr(strTime.c_str(), _T("MS")))
- {
- nTimes = _tstol(strTime.c_str());
- }
- else if (_tcsstr(strTime.c_str(), _T("s")) || _tcsstr(strTime.c_str(), _T("S")))
- {
- nTimes = _tstol(strTime.c_str()) * 1000;
- }
- else if (_tcsstr(strTime.c_str(), _T("m")) || _tcsstr(strTime.c_str(), _T("M")))
- {
- nTimes = _tstol(strTime.c_str()) * 6000;
- }
- else
- {
- // 不带单位或其他的,默认ms;
- nTimes = _tstol(strTime.c_str());
- }
- #endif
- return nTimes;
- }
- int parse_cmd_param_from_file(TCHAR *file_name, std::vector<CommandParam> &vtCommandParams)
- {
- TCHAR buf[MAX_PATH] = {0};
- TCHAR name[MAX_PATH] = {0};
- TCHAR head[MAX_PATH] = {0};
- TCHAR code[MAX_PATH] = {0};
- TCHAR param[MAX_PATH] = {0};
- TCHAR multicode[MAX_PATH] = {0};
- TCHAR cmd_wait_time[MAX_PATH] = {0};
- TCHAR read_wait_time[MAX_PATH] = {0};
- int ret = -1;
- FILE *fp = NULL;
-
- if(!file_name || file_name[0] == '\0' )
- return ret;
- fp = fopen(file_name, "r");
- if(!fp)
- goto EXIT;
- while((fgets((char*)buf, MAX_PATH, fp) != NULL)) {
- int tmp_len = 0;
- unsigned short keycode = 0;
- unsigned int protocol = 0;
- unsigned int scancode = 0;
- tmp_len = _tcslen(buf);
- if(tmp_len >= 1) {
- if (buf[tmp_len - 1] == '\r' || buf[tmp_len - 1] == '\n')
- buf[tmp_len - 1] = 0;
- if(tmp_len >= 2) {
- if(buf[tmp_len - 2] == '\r' || buf[tmp_len - 2] == '\n')
- buf[tmp_len - 2] = 0;
- }
- }
- #if _MSC_VER >= 1500
- //if ( _stscanf_s(buf, "%[^;];%[^;];%[^;];%[^;];%[^;];%[^;];%[^;]", name, MAX_PATH, head, MAX_PATH, code, MAX_PATH, param, MAX_PATH, multicode, MAX_PATH, read_wait_time, MAX_PATH, cmd_wait_time, MAX_PATH) == 7) // 等价下面;
- if ( _stscanf_s(buf, "%[^;];%[^;];%[^;];%[^;];%[^;];%[^;];%s", name, MAX_PATH, head, MAX_PATH, code, MAX_PATH, param, MAX_PATH, multicode, MAX_PATH, read_wait_time, MAX_PATH, cmd_wait_time, MAX_PATH) == 7)
- #endif
- #if _MSC_VER >= 1200 && _MSC_VER < 1500 // VC6.0~8.0
- if ( sscanf(buf, "%[^;];%[^;];%[^;];%[^;];%[^;];%[^;];%[^;]", name, head, code, param, multicode, read_wait_time, cmd_wait_time) == 7)
- #endif
- {
- CommandParam cp;
- parse_key(cp.name, name, _T("Name"));
- parse_key(cp.head, head, _T("HeadCode"));
- parse_key(cp.code, code, _T("Command"));
- parse_key(cp.param, param, _T("CMDParam"));
-
- std::string value;
- parse_key(value, multicode, _T("MultiParams"));
- cp.bMulticode = !_tcsicmp(value.c_str(), _T("true")) ? true : false;
- parse_key(value, read_wait_time, _T("ReadWaitTime"));
- cp.read_wait_time = pares_time_value(value.c_str());
- parse_key(value, cmd_wait_time, _T("CMDWaitTime"));
- cp.cmd_wait_time = pares_time_value(value.c_str());
- vtCommandParams.push_back(cp);
- }
- }
- ret = 0;
- EXIT:
- if(fp)
- fclose(fp);
- return ret;
- }
- unsigned char TwoHexCharToInteger(char high, char low)
- {
- if (!isalpha(high) && isdigit(high) || !isalpha(low) && isdigit(low)) {
- // 应用输出日志;
- return 0;
- }
- char Numb1 = high >= 'A' ? (toupper(high) - '0' - 7) * 16 : (high - '0') * 16;
- char Numb2 = low >= 'A' ? (toupper(low) - '0' - 7) : (low - '0');
- return (Numb1 + Numb2);
- }
- const unsigned short CRC16_TABLE[16] = {
- 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50A5, 0x60C6, 0x70E7,
- 0x8108, 0x9129, 0xA14A, 0xB16B, 0xC18C, 0xD1AD, 0xE1CE, 0xF1EF
- };
- unsigned short CRC16Calculate(byte *pBuffer, unsigned int wordLength)
- {
- unsigned short wordCRC;
- byte byteTemp;
- wordCRC = 0xFFFF;
- while (wordLength--)
- {
- byteTemp = (byte)(wordCRC >> 0x0C);
- wordCRC <<= 4;
- wordCRC ^= CRC16_TABLE[byteTemp ^ ((*pBuffer) >> 0x04)];
- byteTemp = (byte)(wordCRC >> 0x0C);
- wordCRC <<= 4;
- wordCRC ^= CRC16_TABLE[byteTemp ^ ((*pBuffer) & 0x0F)];
- pBuffer++;
- }
- return wordCRC;
- }
- std::string HexStringToBytes(std::string strHex, const int &len /* = 3 */)
- {
- byte value = 0;
- std::string strBytes;
- int nSize = strHex.size();
- for (int i = 0; i < nSize; i += len)
- {
- #if _MSC_VER >=1500
- strBytes.push_back((char)TwoHexCharToInteger(strHex[i], strHex[i + 1]));
- #endif
- #if _MSC_VER >=1200 && _MSC_VER < 1500
- strBytes.append((char)TwoHexCharToInteger(strHex[i], strHex[i + 1]),1);
- #endif
- }
- return strBytes;
- }
- std::string BytesToHexString(const unsigned char *pbuffer, int nLen, char chSpace)
- {
- std::string hex;
- char szhex[5] = {0};
- for (int i = 0; i < nLen; i++)
- {
- memset(szhex, 0, 5);
- #if _MSC_VER >= 1200 && _MSC_VER < 1500
- sprintf(szhex, "%02X%c", pbuffer[i], chSpace);
- #endif
- #if _MSC_VER >= 1500
- _stprintf_s(szhex, "%02X%c", pbuffer[i], chSpace);
- #endif
- hex.append(szhex);
- }
- return hex.substr(0, hex.size() - 1);
- }
- std::string BytesToHexString(const unsigned char *pbuffer, int nLen)
- {
- std::string hex;
- char szhex[5] = {0};
- for (int i = 0; i < nLen; i++)
- {
- memset(szhex, 0, 5);
-
- #if _MSC_VER >= 1200 && _MSC_VER < 1500
- sprintf(szhex, "%02X", pbuffer[i]);
- #endif
- #if _MSC_VER >= 1500
- _stprintf_s(szhex, "%02X", pbuffer[i]);
- #endif
- hex.append(szhex);
- }
- return hex;
- }
- BOOL IsValidString(LPCTSTR lpszString)
- {
- if (lpszString == NULL)
- return FALSE;
- do
- {
- // ASCII可显示的字符;
- if (*lpszString < 32 || *lpszString > 126)
- {
- return FALSE;
- }
- } while (*++lpszString);
- return TRUE;
- }
- // 去除空格;
- std::string &trim(std::string &str)
- {
- #if 0
- int nIndex = 0;
- while ((nIndex = str.find_first_of(' ')) != std::string::npos)
- str.erase(nIndex, 1);
- return str;
- #endif
- #if _MSC_VER > 1900
- str.erase(std::remove_if(str.begin(), str.end(), [](unsigned char x) {return std::isspace(x); }), str.end()); //C++17
- #endif
- #if _MSC_VER >= 1200 && _MSC_VER < 1600
- for (std::string::iterator it = str.begin(); it != str.end();) {
- !isspace(*it) ? it++ : it = it = str.erase(it);
- }
- #endif
- return str;
- }
|