2025年1月31日 星期五 甲辰(龙)年 冬月廿九 设为首页 加入收藏
rss
您当前的位置:首页 > 计算机 > 编程开发 > VC/VC++

进制和字符串之间的转换

时间:09-16来源:作者:点击数:28
城东书院 www.cdsy.xyz

功能: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;
  • }
城东书院 www.cdsy.xyz
方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门
本栏推荐