功能: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;
}