这些简单的转换是用的比较频繁的, 因此将这些功能全部封装在一个类中

头文件

 #pragma once
#include <stdlib.h>
#include <string>
#include "tchar.h"
#include "windows.h"
using namespace std;
enum TRANSFORM
{
SINGLECHAR, //单字节转换 eg:0x2121 => 33 33
ALLCHAR, //所有字节转换 eg:0x2121 => 8481
};
class Transform
{
public:
Transform(void);
~Transform(void); public:
string HexStrToAsciiStr(string strValue);
string AsciiStrToHexStr(string strValue);
string HexToDescInt(string strVaule, TRANSFORM);
string DescIntToHex(string strValue);
string TCharToString(TCHAR* TValue);
void StringToTChar(string strValue, TCHAR* DestTchar);
private:
string strRepalce(string& strValue, string strSrc, string strDest);
};

cpp文件

 #include "Transform.h"
#pragma warning(disable:4996) Transform::Transform(void)
{ } Transform::~Transform(void)
{ } string Transform::HexStrToAsciiStr(string strValue)
{
string strTemp;
if(strValue.find("0x") != string::npos || strValue.find("0X") != string::npos)
{
if(strValue.find("0x") != string::npos)
strTemp = strRepalce(strValue, "0x", "");
else
strTemp = strRepalce(strValue, "0X", "");
}
if(strTemp.length() % != )
strTemp.insert(, , '');
string strRet;
int temp = ;
for(int i = ; i < strTemp.length(); i++)
{
int flag = (i % == ) ? : ;
if(strTemp.c_str()[i] > '' && strTemp.c_str()[i] < '')
{
temp += (strTemp.c_str()[i] - '')*flag;
}
else if(strTemp.c_str()[i] == 'a' || strTemp.c_str()[i] == 'A')
{
temp += (*flag);
}
else if(strTemp.c_str()[i] == 'b' || strTemp.c_str()[i] == 'B')
{
temp += (*flag);
}
else if(strTemp.c_str()[i] == 'c' || strTemp.c_str()[i] == 'C')
{
temp += (*flag);
}
else if(strTemp.c_str()[i] == 'd' || strTemp.c_str()[i] == 'D')
{
temp += (*flag);
}
else if(strTemp.c_str()[i] == 'e' || strTemp.c_str()[i] == 'E')
{
temp += (*flag);
}
else if(strTemp.c_str()[i] == 'f' || strTemp.c_str()[i] == 'F')
{
temp += (*flag);
}
if(i % != )
{
strRet+=temp;
temp =;
}
}
return strRet;
} string Transform::AsciiStrToHexStr(string strValue)
{
if(strValue.length() == )
return "";
char Src[] = { };
strcpy_s(Src, strValue.c_str());
int len = strValue.length();
char* Dest = (char*)calloc(*len +, sizeof(char));
for( int i = , j = ; i < strlen(strValue.c_str()); i++ )
{
char HiHalf = Src[i] >> ;
char LoHalf = Src[i] & 0x0F;
Dest[j++] = ( HiHalf <= ) ? ( HiHalf + '' ) : ( HiHalf - + 'A' );
Dest[j++] = ( LoHalf <= ) ? ( LoHalf + '' ) : ( LoHalf - + 'A' );
}
string strRet = Dest;
delete[] Dest;
Dest = NULL;
return strRet;
} string Transform::HexToDescInt(string strVaule, TRANSFORM tfType)
{
if(strVaule.find("0x") != string::npos || strVaule.find("0X") != string::npos)
{
if(strVaule.find("0x") != string::npos)
strVaule = strRepalce(strVaule, "0x", "");
else
strVaule = strRepalce(strVaule, "0X", "");
} if(strVaule.length() % != )
strVaule.insert(, , '');
if(strVaule.length() == )
return "";
string strRet;
unsigned long iValue = ;
switch(tfType)
{
case ALLCHAR:
{
for(int i = ; i < strVaule.length(); i++)
{
iValue += (strVaule.c_str()[i] - '') << *(strVaule.length() - i -);
}
strRet = to_string(iValue);
}break;
case SINGLECHAR:
{
for(int i = ; i < strVaule.length(); i+=)
{
iValue += (strVaule.c_str()[i] - '') << ;
if(strVaule.length() >= i+)
{
iValue += (strVaule.c_str()[i+] - '');
}
strRet += (to_string(iValue) + " ");
iValue = ;
}
}break;
default:
break;
}
return strRet;
} string Transform::DescIntToHex(string strValue)
{
if(strValue.length() == )
return "";
if(strValue.length() % != )
strValue.insert(, , '');
char temp[] = { };
int iValue = atoi(strValue.c_str());
itoa(iValue, temp, );
string strRet = "0x";
strRet+= temp;
return strRet;
} string Transform::strRepalce(string& strValue, string strSrc, string strDest)
{
string::size_type pos = ;
string::size_type srclen = strSrc.size();
string::size_type dstlen = strDest.size(); while( (pos=strValue.find(strSrc, pos)) != std::string::npos )
{
strValue.replace( pos, srclen, strDest );
pos += dstlen;
}
return strValue;
} string Transform::TCharToString(TCHAR* TValue)
{
string strRet;
int iLength ;
//获取字节长度
iLength = WideCharToMultiByte(CP_ACP, , TValue, -, NULL, , NULL, NULL);
//将tchar值赋给_char
char* szChar = (char*)calloc(iLength, sizeof(char));
WideCharToMultiByte(CP_ACP, , TValue, -, szChar, iLength, NULL, NULL);
strRet = szChar;
delete[] szChar;
szChar = NULL;
return strRet;
}
void Transform::StringToTChar(string strValue, TCHAR* DestTchar)
{
int iLength ;
iLength = MultiByteToWideChar (CP_ACP, , strValue.c_str(), strlen (strValue.c_str()) + , NULL, );
MultiByteToWideChar (CP_ACP, , strValue.c_str(), strlen (strValue.c_str()) + , DestTchar, iLength) ;
}

测试文件

 #include<stdio.h>
#include "Transform.h" int main()
{
Transform m_obj;
string value= "3135353734414EmM";
string Hex = m_obj.AsciiStrToHexStr(value);
printf("Hex = %s \n", Hex.c_str()); string asic = m_obj.HexStrToAsciiStr("0x303132343335363738394d5e6f20212223");
printf("asci= %s\n", asic.c_str()); string DecInt = m_obj.HexToDescInt("0x11122", ALLCHAR);
printf("DesInt = %s \n", DecInt.c_str());
DecInt = m_obj.HexToDescInt("0x11122", SINGLECHAR);
printf("DesInt = %s \n", DecInt.c_str()); string hex = m_obj.DescIntToHex("");
printf("hex = %s\n", hex.c_str()); string szChar = m_obj.TCharToString(_T("Hello World"));
printf("szChar = %s\n", szChar.c_str()); TCHAR tempChar[] ={ };
m_obj.StringToTChar("Hello C++", tempChar); printf("tChar = %s\n", (char*)tempChar);
getchar();
return ;
}
16进制字符串转10进制
调用系统函数pow(int x, int y)
x: 基数 y:指数 int HexToInt(string s)
{
//STL 函数将字符串全部转大写
transform(s.begin(), s.end(), s.begin(), ::toupper);
int count = s.length();
int sum = 0;
for (auto it : s)
{
//A 的assic 为65. it-55:表示A~F转10~15
int flag = (it >= 65) ? (it - 55) : (it - 48);
if (flag < 0 || flag > 15) continue;
sum += flag *pow(16, --count);
}
printf("sum = %d\n", sum);
return sum;
}

  

PS: 代码写的有点low, 仅供参考 ~_~

C++ 10进制, 16进制, ASCII码, 单字节与多字节的相互转换的更多相关文章

  1. js 解密 16进制转10进制,再取ascii码的对应值

    如:\x64 对应 16进制 0x64 转10进制就是 0x64.toString(10) == 100, 查对应的ascii码表得到 ‘d' <div id=code style='displ ...

  2. ASCII, Unicode, UTF-8, 8进制, 16进制等各种编码学习理解笔记

    字符编码的发展历史 Unicode和UTF-8有何区别? 在这个问题下的于洋的最高票回答中,比较完整地介绍了字符编码的发展历史,为了便于记忆,再次简要概括一番. 一个字节:最初一个字节的标准是混乱的, ...

  3. Oracle中如何进行进制转换(2进制,10进制,16进制)

    1.16进制转换为10进制 可以通过to_number函数实现 SQL> select to_number('19f','xxx') from dual; TO_NUMBER('19F','XX ...

  4. java中 8进制 10进制 2进制 16进制 相互转换

    十进制转成十六进制: Integer.toHexString(int i) 十进制转成八进制 Integer.toOctalString(int i) 十进制转成二进制 Integer.toBinar ...

  5. Delphi - 10进制16进制相互转换

    10进制转16进制 使用IntToHex可以实现十进制到十六进制的转换,注意这里的参数有两个,第一个表示需要被转换的10进制数,第二个表示转换后用几位来显示16进制数. 代码如下: function ...

  6. JS吧数字转成2进制 8进制16进制数据

    ; number.toString(); //转成2进制 number.toString();//转成8进制 number.toString();//转成10进制 number.toString(); ...

  7. 关于 NSData 的数据类型(2进制,16进制之间)及深入剖析(转)

    . NSData 与 NSString NSData-> NSString NSString *aString = [[NSString alloc initWithData:adataenco ...

  8. 关于 NSData 的数据类型(2进制,16进制之间)及深入剖析

    1. NSData 与 NSString NSData-> NSString NSString *aString = [[NSString alloc initWithData:adataenc ...

  9. c#与js中10进制16进制的转化,记录防忘

    js: var param="11"; param=parseInt(param,16);  //17 param=parseInt(param,10);  //11 //后面的参 ...

随机推荐

  1. linux jconsole的远程配置--实测可用

    工作上,经常要对tomcat的java内存配置.tomcat线程池等进行调(luan)优(gao). jconsole 是一个最基础用到的jdk自带的JVM性能查看工具. 最近进行linux测试. 所 ...

  2. tensorboard--打开训练的日志文件

    tensorboard --logdir=logs 注意:等号之间不要空格.

  3. Windows 上安装 Rust 出错及其解决办法

    首先去 https://www.rust-lang.org/tools/install Rust 官网上下载相应的安装包. 直接运行 rustup-init.exe,这一步 会把 rustc, car ...

  4. vue中使用的一些问题(IE不兼容,打包样式不生效)

    通过脚手架快速创建的项目,使用了swiper组件,项目中使用了es6语法,使用了babel-polyfill转化依旧不行,仔细排查项目中的使用组件,最后找到问题所在 swiper4.5.0版本太高,不 ...

  5. 机器学习实战:基于Scikit-Learn和TensorFlow 第5章 支持向量机 学习笔记(硬间隔)

    数据挖掘作业,需要实现支持向量机进行分类,记录学习记录 环境:win10,Python 3.7.0 SVM的基本思想:在类别之间拟合可能的最宽的间距,也叫作最大间隔分类 书上提供的源代码绘制了两个图, ...

  6. C/C++中new的使用规则

    本人未重视new与指针的使用,终于,终于在前一天船翻了,而且没有爬上岸: 故此,今特来补全new的用法,及其一些规则: 话不多说 C++提供了一种“动态内存分配”机制,使得程序可以在运行期间,根据实际 ...

  7. Java操作zip-压缩和解压文件

    一.说明 rar格式的压缩包收费,java支持zip格式的压缩和解压 二.工具类 import java.io.*; import java.util.Enumeration; import java ...

  8. webpack4 打包静态资源

    demo 代码点此,开始之前,先做点准备工作. 准备工作 准备一个空文件夹,然后执行下列命令: npm init -y npm i -D webpack webpack-cli 然后创建一个 dist ...

  9. linux 广播和组播

    广播和组播 广播,必须使用UDP协议,是只能在局域网内使用,指定接收端的IP为*.*.*.255后,发送的信息,局域网内的所有接受端就能够接到信息了. 广播的发送端代码 #include <st ...

  10. time,datetime,random,os,sys,hashlib,logging,configparser,re模块

    #-----time模块----- print(help(time)) #打印time帮助文档 print(time.time()) #打印时间戳 1569824501.6265268 time.sl ...