功能:CRC校验、十六进制的数据转化成字符串形式、字符串转化为hex、高半字节转换成字符、二进制流的hex编码、分割字符数组、HEX字符串转数字等
将头文件和源文件包含进去就可以使用
- #pragma once
- #include <string>
- using std::string;
- #include <vector>
-
- unsigned short crc_16(UINT8 *Array, UINT8 *Rcvbuf, int length);
- //将十六进制的数据转化成字符串形式
- unsigned int hexToString(UINT8 *btData, unsigned int length, char *& szHex);
- //将十六进制的数据转化成字符串形式
- unsigned int hexToStringSplite(UINT8 *btData, unsigned int length, char chSplite, char *& szHex);
- //将字符串转化为hex
- unsigned int StringToHex(const char *szHex, unsigned int length, UINT8 *btData);
- //字符串转hex
- UINT8 CharToHex(char c);
- //高半字节转换成字符
- char HalfHighUINT8(UINT8 btValue);
- //低半字节转换成字符
- char HalfLowerUINT8(UINT8 btValue);
- //二进制流的hex编码
- int ChangeEncoding(void *pValue, UINT8 btMode, char *p);
- //分割字符数组
- UINT SpliteString(std::string szSrc, char chSplite, std::vector<std::string> &szArray);
- //HEX字符串转数字
- int HexStrToInt(const char *chHex);
- short HexStrToShort(const char *chPos);
- float HexStrToFloat(const char *chValue);
- //查找
- UINT8* mem_find(const UINT8 *target,const UINT8 *pattern, int target_length, int pattern_length);
- //查抄字符
- UINT8* mem_find_char(const UINT8 *target, const UINT8 pattern, int target_length);
- //判断序列号合法
- bool isLegal(char *chVersion);
- //判断是否为文件
- bool IsFile(const char* pathName);
- //计算校验和
- UINT8 checksum(UINT8 *buf, UINT16 len);
-
- string CurrentHourMinuteSecond();
- string GetAppDir();//获取当前应用程序目录
-
- #include "StdAfx.h"
- #include "toolFun.h"
-
- #include <math.h>
- #include <time.h>
- static const unsigned short crc16tab[256] = {
- 0x0000,0x1021,0x2042,0x3063,0x4084,0x50a5,0x60c6,0x70e7,
- 0x8108,0x9129,0xa14a,0xb16b,0xc18c,0xd1ad,0xe1ce,0xf1ef,
- 0x1231,0x0210,0x3273,0x2252,0x52b5,0x4294,0x72f7,0x62d6,
- 0x9339,0x8318,0xb37b,0xa35a,0xd3bd,0xc39c,0xf3ff,0xe3de,
- 0x2462,0x3443,0x0420,0x1401,0x64e6,0x74c7,0x44a4,0x5485,
- 0xa56a,0xb54b,0x8528,0x9509,0xe5ee,0xf5cf,0xc5ac,0xd58d,
- 0x3653,0x2672,0x1611,0x0630,0x76d7,0x66f6,0x5695,0x46b4,
- 0xb75b,0xa77a,0x9719,0x8738,0xf7df,0xe7fe,0xd79d,0xc7bc,
- 0x48c4,0x58e5,0x6886,0x78a7,0x0840,0x1861,0x2802,0x3823,
- 0xc9cc,0xd9ed,0xe98e,0xf9af,0x8948,0x9969,0xa90a,0xb92b,
- 0x5af5,0x4ad4,0x7ab7,0x6a96,0x1a71,0x0a50,0x3a33,0x2a12,
- 0xdbfd,0xcbdc,0xfbbf,0xeb9e,0x9b79,0x8b58,0xbb3b,0xab1a,
- 0x6ca6,0x7c87,0x4ce4,0x5cc5,0x2c22,0x3c03,0x0c60,0x1c41,
- 0xedae,0xfd8f,0xcdec,0xddcd,0xad2a,0xbd0b,0x8d68,0x9d49,
- 0x7e97,0x6eb6,0x5ed5,0x4ef4,0x3e13,0x2e32,0x1e51,0x0e70,
- 0xff9f,0xefbe,0xdfdd,0xcffc,0xbf1b,0xaf3a,0x9f59,0x8f78,
- 0x9188,0x81a9,0xb1ca,0xa1eb,0xd10c,0xc12d,0xf14e,0xe16f,
- 0x1080,0x00a1,0x30c2,0x20e3,0x5004,0x4025,0x7046,0x6067,
- 0x83b9,0x9398,0xa3fb,0xb3da,0xc33d,0xd31c,0xe37f,0xf35e,
- 0x02b1,0x1290,0x22f3,0x32d2,0x4235,0x5214,0x6277,0x7256,
- 0xb5ea,0xa5cb,0x95a8,0x8589,0xf56e,0xe54f,0xd52c,0xc50d,
- 0x34e2,0x24c3,0x14a0,0x0481,0x7466,0x6447,0x5424,0x4405,
- 0xa7db,0xb7fa,0x8799,0x97b8,0xe75f,0xf77e,0xc71d,0xd73c,
- 0x26d3,0x36f2,0x0691,0x16b0,0x6657,0x7676,0x4615,0x5634,
- 0xd94c,0xc96d,0xf90e,0xe92f,0x99c8,0x89e9,0xb98a,0xa9ab,
- 0x5844,0x4865,0x7806,0x6827,0x18c0,0x08e1,0x3882,0x28a3,
- 0xcb7d,0xdb5c,0xeb3f,0xfb1e,0x8bf9,0x9bd8,0xabbb,0xbb9a,
- 0x4a75,0x5a54,0x6a37,0x7a16,0x0af1,0x1ad0,0x2ab3,0x3a92,
- 0xfd2e,0xed0f,0xdd6c,0xcd4d,0xbdaa,0xad8b,0x9de8,0x8dc9,
- 0x7c26,0x6c07,0x5c64,0x4c45,0x3ca2,0x2c83,0x1ce0,0x0cc1,
- 0xef1f,0xff3e,0xcf5d,0xdf7c,0xaf9b,0xbfba,0x8fd9,0x9ff8,
- 0x6e17,0x7e36,0x4e55,0x5e74,0x2e93,0x3eb2,0x0ed1,0x1ef0
- };
-
- // 计算crc校验
- unsigned short crc_16(UINT8 *Array, UINT8 *Rcvbuf, int length)
- {
- unsigned int crc = 0;
- int i = 0;
-
- for(i = 0; i < length; i++)
- {
- crc = (crc<<8) ^ crc16tab[((crc>>8) ^ (*Array++))&0x00FF];
- }
-
- Rcvbuf[0] = (crc & 0xff00)>>8;
- Rcvbuf[1] = (crc & 0x00ff);
-
- return crc;
- }
-
- //将十六进制的数据转化成字符串形式
- unsigned int hexToString(UINT8 *btData, unsigned int length, char *& szHex)
- {
- unsigned int i = 0;
- UINT8 btHalf;
-
- while(i < 2*length)
- {
- //高半字节
- btHalf = ((UINT8)(*btData))>>4;
-
- if(btHalf >= 0 && btHalf <= 9)
- szHex[i++] = 0x30 + btHalf;
- else
- szHex[i++] = 0x37 + btHalf;
-
- //低半字节
- btHalf = 0x0f&(*btData);
-
- if(btHalf >= 0 && btHalf <= 9)
- szHex[i++] = 0x30 + btHalf;
- else
- szHex[i++] = 0x37 + btHalf;
-
- btData++;
- }
- return i;
- }
-
- //将十六进制的数据转化成字符串形式
- unsigned int hexToStringSplite(UINT8 *btData, unsigned int length, char chSplite, char *& szHex)
- {
- unsigned int i = 0, j = 0;
- UINT8 btHalf;
-
- while(i < length)
- {
- //高半字节
- btHalf = ((UINT8)(*btData))>>4;
-
- if(btHalf >= 0 && btHalf <= 9)
- szHex[j++] = 0x30 + btHalf;
- else
- szHex[j++] = 0x37 + btHalf;
-
- //低半字节
- btHalf = 0x0f&(*btData);
-
- if(btHalf >= 0 && btHalf <= 9)
- szHex[j++] = 0x30 + btHalf;
- else
- szHex[j++] = 0x37 + btHalf;
-
- //添加分隔符
- szHex[j++] = ',';
- btData++;
- i++;
- }
- return j;
- }
-
- //将字符串转化为hex
- unsigned int StringToHex(const char *szHex, unsigned int length, UINT8 *btData)
- {
- unsigned int i = 0;
- unsigned char btHigh;
- unsigned char btLower;
- UINT8 *pDst = btData;
-
- while(i < length)
- {
- btHigh = CharToHex(*szHex++);
- btLower = CharToHex(*szHex++);
-
- *pDst = (btHigh << 4);
- *pDst |= btLower;
- pDst++;
- i += 2;
- }
- *pDst = 0;
- return (pDst-btData);
- }
-
- //字符串转hex
- UINT8 CharToHex(char c)
- {
- if((c>='0')&&(c<='9'))
- return c-0x30;
- else if((c>='A')&&(c<='F'))
- return c-'A'+10;
- else if((c>='a')&&(c<='f'))
- return c-'a'+10;
- else
- return 0x10;
- }
- //高半字节转换成字符
- char HalfHighUINT8(UINT8 btValue)
- {
- char chHex = 0;
- UINT8 btHalf = 0;
- //高半字节
- btHalf = (btValue>>4);
-
- if(btHalf >= 0 && btHalf <= 9)
- chHex = 0x30 + btHalf;
- else // A ~ F
- chHex = 0x37 + btHalf;
-
- return chHex;
- }
-
- //低半字节转换成字符
- char HalfLowerUINT8(UINT8 btValue)
- {
- char chHex = 0;
- UINT8 btHalf = 0;
- //高半字节
- btHalf = (0x0F & btValue);
-
- if(btHalf >= 0 && btHalf <= 9)
- chHex = 0x30 + btHalf;
- else
- chHex = 0x37 + btHalf;
-
- return chHex;
- }
-
- //去除字符串两边的空格
- void Trim(std::string& szSrc)
- {
- if(!szSrc.empty()) {
- while(0 == szSrc.find(' ')) szSrc.replace(0, 1, "");
- while(szSrc.size()-1 == szSrc.rfind(' ')) szSrc.replace(szSrc.size()-1, 1, "");
- }
- }
-
- //分割字符数组
- UINT SpliteString(std::string szSrc, char chSplite, std::vector<std::string>& szArray)
- {
- std::string::size_type index = std::string::npos;
- std::string szTemp;
-
- //去掉空格
- szArray.clear();
- Trim(szSrc);
- if(szSrc.empty()) return 0;
-
- while(std::string::npos != (index = szSrc.find(chSplite)))
- {
- szTemp = szSrc.substr(0, index); //去掉两端空格
- Trim(szTemp);
- if (!szTemp.empty())szArray.push_back(szTemp);
- szSrc = szSrc.substr(index+1);
- }
- //过滤空格
- Trim(szSrc);
- if(!szSrc.empty()) {
- szArray.push_back(szSrc);
- }
- return szArray.size();
- }
-
- //HEX字符串转数字
- int HexStrToInt(const char *chHex)
- {
- unsigned int data = 0;
- UINT8 btValue = 0;
- size_t nLen = strlen(chHex);
-
- for(size_t i=0; i< nLen; i++)
- {
- btValue = CharToHex(*chHex);
- if(0x10 == btValue) break;
- data *= 16;
- data += btValue;
- chHex++;
- }
- return (int)data;
- }
-
- short HexStrToShort(const char *chPos)
- {
- short data = 0;
- UINT8 btValue = 0;
- int nLen = strlen(chPos);
-
- for(int i=0; i< nLen; i++)
- {
- btValue = CharToHex(*chPos);
- if (0x10 == btValue) break;
- data *= 16;
- data += btValue;
-
- chPos++;
- }
- return data;
- }
-
-
- float HexStrToFloat(const char *chValue)
- {
- float fValue = 0.0;
- char *p = (char*)chValue;
- UINT8 btValue = 0;
- int data = 0, nLen = strlen(p);
-
- for(int i=0; i< nLen; i++)
- {
- btValue = CharToHex(*p);
- if(0x10 == btValue) break;
- data *= 16;
- data += btValue;
-
- p++;
- }
- //取得浮点数
- memcpy(&fValue, &data, sizeof(float));
-
- return fValue;
- }
-
- //将具体数值用机内码的十六进制的ASCII形式表示
- int ChangeEncoding(void *pValue, UINT8 btMode, char *p)
- {
- //btMode: 0 字符类型, 1 UINT8类型, 2 short类型, 3 int类型, 4浮点型数据
- UINT8 btHalf = 0;
- int nSize = 0, j =0;
- bool bFlag = false;
-
- switch(btMode)
- {
- case 0://字符型
- {
- char *str = (char *)pValue;
- //字符串长度
- nSize = strlen(str);
- for (int i = 0; i < nSize; i++)
- {
- p[j++] = str[i];
- }
- break;
- }
- case 1://UINT8型
- {
- UINT8 btValue = *((UINT8*)pValue);
- nSize = 2*sizeof(UINT8);
-
- j = 0;
- for (int i = nSize-1; i >= 0; i--)
- {
- //每次移动的位数
- btHalf = (btValue >> (4*i));
- btHalf &= 0x0F;
- if(btHalf >= 0 && btHalf <= 9)
- p[j++] = 0x30 + btHalf;
- else
- p[j++] = 0x37 + btHalf;
- }
-
- break;
- }
- case 2://Short型
- {
- short *nValue = (short*)pValue;
- nSize = 2*sizeof(short);
-
- for (int i = nSize-1; i >= 0; i--)
- {
- //每次移动的位数
- btHalf = ((*nValue) >> (4*i));
- btHalf &= 0x0F;
- //过滤前面多余的零
- if(!bFlag)
- {
- if(0x0 != btHalf || i<2)
- {
- bFlag = true;
- }
- else
- {
- continue;
- }
- }
- //存放数值
- if(btHalf >= 0 && btHalf <= 9)
- p[j++] = 0x30 + btHalf;
- else
- p[j++] = 0x37 + btHalf;
- }
-
- break;
- }
- case 3://int型
- case 4://float型
- {
- int *nValue = (int*)pValue;
- nSize = 2 * sizeof(int);
-
- for (int i = nSize - 1; i >= 0; i--)
- {
- //每次移动的位数
- btHalf = ((*nValue) >> (4 * i));
- btHalf &= 0x0F;
- //过滤前面多余的零
- if(!bFlag)
- {
- if(0x0 != btHalf || i < 2)
- {
- bFlag = true;
- }
- else
- {
- continue;
- }
- }
- if(btHalf >= 0 && btHalf <= 9)
- p[j++] = 0x30 + btHalf;
- else
- p[j++] = 0x37 + btHalf;
- }
-
- break;
- }
- default:
- break;
- }
- //末尾加上逗号
- p[j++] = ',';
- return j;
- }
-
- UINT8* mem_find(const UINT8 *target,const UINT8 *pattern, int target_length, int pattern_length)
- {
- int overlay_value[64] = {0};
- int pattern_index = 0;
- int target_index = 0;
-
- if((NULL == target) || (NULL == pattern) || (target_length <= 0) || (pattern_length <= 0))
- return NULL;
-
- overlay_value[0] = -1; //remember:next array's first number was -1.
- //next array
- for (pattern_index=1; pattern_index<pattern_length; ++pattern_index) //注,此处的i是从1开始的
- {
- target_index = overlay_value[pattern_index-1];
-
- while(target_index >= 0 && pattern[target_index+1] != pattern[pattern_index])
- {
- target_index = overlay_value[target_index];
- }
- if(pattern[target_index+1] == pattern[pattern_index])
- {
- overlay_value[pattern_index] = target_index+1;
- }
- else
- {
- overlay_value[pattern_index] = -1;
- }
- }
- pattern_index = 0;
- target_index=0;
-
- while (pattern_index<pattern_length && target_index<target_length)
- {
- if (target[target_index] == pattern[pattern_index])
- {
- ++target_index;
- ++pattern_index;
- }
- else if(pattern_index==0)
- {
- ++target_index;
- }
- else
- {
- pattern_index=overlay_value[pattern_index-1]+1;
- }
- }
-
- if(pattern_index == pattern_length)
- {
- target_index = target_index-pattern_index;
- return (UINT8*)(target+target_index);
- }
- else
- {
- return NULL;
- }
- }
-
- UINT8* mem_find_char(const UINT8 *target, const UINT8 pattern, int target_length)
- {
- UINT8 *index = (UINT8*)target;
- int target_index = 0;
-
- if((NULL == target) || (target_length <= 0))
- return NULL;
-
- while (target_length > 0) {
- if(*index == pattern) break;
- index++;
- --target_length;
- }
- if(0 == target_length) return NULL;
- return index;
- }
-
-
- //判断序列号合法
- bool isLegal(char *chVersion)
- {
- int i = 0;
- int nLen = strlen(chVersion);
- bool bFalg = true;
-
- while (i< nLen)
- {
- if (chVersion[i]>='0' && chVersion[i]<='9')
- {
-
- }
- else if(chVersion[i]>='A' && chVersion[i]<='Z')
- {
-
- }
- else if(chVersion[i]>='a' && chVersion[i]<='z')
- {
-
- }
- else if(chVersion[i]=='_' || chVersion[i]=='-')
- {
-
- }
- else if(chVersion[i]==' ')//2013-9-10Add By LJZ
- {
-
- }
- else
- {
- bFalg = false;
-
- break;
- }
- i++;
- }
- return bFalg;
- }
-
- //判断是否为文件
- bool IsFile(const char* pathName)
- {
- DWORD dwFileAttr = -1;
-
- dwFileAttr = ::GetFileAttributesA(pathName);
- if(INVALID_FILE_ATTRIBUTES == dwFileAttr) return false;
- //目录
- if(0 != (dwFileAttr & FILE_ATTRIBUTE_DIRECTORY)) return false;
- //压缩文件
- if(0 != (dwFileAttr & FILE_ATTRIBUTE_COMPRESSED)) return false;
- //设杯文件
- if(0 != (dwFileAttr & FILE_ATTRIBUTE_DEVICE)) return false;
- //快捷方式
- if(0 != (dwFileAttr & FILE_ATTRIBUTE_REPARSE_POINT)) return false;
-
- return true;
- }
-
-
- //计算校验和
- UINT8 checksum(UINT8 *buf, UINT16 len)
- {
- UINT16 ret = 0;
- UINT8 lrcVal = 0, val = 0;
-
- if((NULL != buf) && (len > 0))
- {
- while(len)
- {
- val = *buf;
- lrcVal += val;
- len --;
- buf++;
- }
- lrcVal &= 0xFF;
- lrcVal = ~lrcVal;
- lrcVal += 1;
- }
- return lrcVal;
- }
-
- string CurrentHourMinuteSecond()
- {
- time_t rawtime;
- char buffer [128];
- time (&rawtime);
- strftime (buffer,sizeof(buffer),"%Y/%m/%d %H:%M:%S",localtime(&rawtime));
- return buffer;
- }
-
- string GetAppDir()//获取当前应用程序目录
- {
- string szAppDir = "";
- char chPath[MAX_PATH] = {0};
-
- //获取当前应用程序路径
- ::GetModuleFileName(NULL, chPath, MAX_PATH);
- char *pIndex = strrchr(chPath, '\\');
- *pIndex = 0;
- szAppDir = chPath;
-
- return szAppDir;
- }
-