MFC中将用户输入的表示16进制数的字符串转换成16进制数输出显示(包含1.wstring转成string的方法函数2.用boost库拆分字符串的函数3.字符转16进制数值的函数)

前期准备:
1.电脑中安装好boost库,我的电脑中安装在C盘根目录下,如下图所示:
MFC中将用户输入的表示16进制数的字符串转换成16进制数输出显示(包含1.wstring转成string的方法函数2.用boost库拆分字符串的函数3.字符转16进制数值的函数)
2.配置好boost环境变量,如下图所示:
MFC中将用户输入的表示16进制数的字符串转换成16进制数输出显示(包含1.wstring转成string的方法函数2.用boost库拆分字符串的函数3.字符转16进制数值的函数)
3.开发环境VS2015,工程为MFC应用程序

需要的头文件如下:

#include <string>
#include <vector>
#include <boost\algorithm\string.hpp>//1.需要在电脑中配置好boost库2.需要在属性——VC++目录——包含目录中增加$(BOOST_ROOT)
#include <boost\lexical_cast.hpp>
using namespace boost;
using namespace std;

主要代码如下:

//将字符转换为数值
static char HexChar(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;
}

//将string转为16进制的数之后放入unsigned char类型的vector中,并且是字符串中每两个字符组成一个16进制数
std::vector<unsigned char> Str2Hex(string str)
{
	std::vector<unsigned char> vData;
	int len = (int)str.length();

	for (int i = 0; i < len;)
	{
		unsigned char h = str[i];
		if (h == ' ')
		{
			i++;
			continue;
		}
		i++;
		if (i >= len)
			break;
		unsigned char l = str[i];
		int t = HexChar(h);
		int t1 = HexChar(l);
		if ((t == 16) || (t1 == 16))
			break;
		else
			t = t * 16 + t1;
		i++;
		vData.push_back((unsigned char)t);
	}
	return vData;
}

//将wstring转成string
static string Unicode2Utf8(const wstring& unicodeStr)
{
	std::string retStr("");
	int strLen = (int)::WideCharToMultiByte(CP_UTF8, NULL, unicodeStr.c_str(), (int)wcslen(unicodeStr.c_str()), NULL, 0, NULL, NULL);
	if (strLen == 0)
		return retStr;
	std::vector<char> strBuffer(strLen, '\0');
	::WideCharToMultiByte(CP_UTF8, NULL, unicodeStr.c_str(), (int)wcslen(unicodeStr.c_str()), &strBuffer[0], strLen, NULL, NULL);

	retStr.assign(strBuffer.begin(), strBuffer.end());
	return retStr;
}

//用boost::trim去掉字符串中的空格
static void TrimString(std::vector<wstring>& vStr)
{
	for (size_t t = 0; t < vStr.size(); ++t)
	{
		boost::trim(vStr[t]);
	}
}

//改函数用于将一个wstring变量strTarget根据strSeperator字符串来断开,并存储至vector容器中作为返回值
static std::vector<wstring> SplitString(wstring strTarget, wstring strSeperator, algorithm::token_compress_mode_type type = token_compress_on, bool m_bTrim = true)
{
 	std::vector<wstring> vSplitRslt;
 	boost::split(vSplitRslt, strTarget, boost::is_any_of(strSeperator), type);//使用该函数需要将项目——属性——C/C++——常规——中的SDL检查设置为否,不然会编译不通过
	if (m_bTrim)
	{
		TrimString(vSplitRslt);
	}

	return vSplitRslt;
}
void CCStringToHexDlg::OnBnClickedButton1()//界面上“开始转换”按钮的响应函数
{
	CString strGetEditString, strOutEditString;
	GetDlgItem(IDC_EDIT1)->GetWindowText(strGetEditString);//获取用户输入的字符串赋值给strGetEditString变量
	wstring wstraddr = strGetEditString.GetString();//wstring要使用#include <string>和using namespace std;
	std::vector<wstring> vgetstr = SplitString(wstraddr, L",");//将获取到的字符串根据“,”分开,注意是英文的逗号!
	int ngetNum = vgetstr.size();
	std::vector<unsigned char> vgetChar;
	vgetChar.resize(ngetNum);
	for (int i = 0; i < ngetNum; i++)
	{
		string strTemp = Unicode2Utf8(vgetstr[i]);
		vector<unsigned char> vTempChar = Str2Hex(strTemp);//将string转为16进制的数之后放入unsigned char类型的vector中,并且是字符串中每两个字符组成一个16进制数
		if (vTempChar.size() != 1)
		{
			AfxMessageBox(_T("输入数据格式错误,请重新输入!"));
			return;
		}
		vgetChar[i] = vTempChar[0];
	}
	CString cstrTemp;
	for (int i = 0; i < vgetChar.size(); i++)
	{
		if (i == 0)
		{
			cstrTemp.Format(_T("0x%02x"), vgetChar[i]);
		}
		else
		{
			cstrTemp.Format(_T(",0x%02x"), vgetChar[i]);
		}
		strOutEditString = strOutEditString + cstrTemp;
	}
	GetDlgItem(IDC_EDIT2)->SetWindowTextW(strOutEditString);//显示到界面上第二个edit框中,输出为16进制数

	strOutEditString.Format(_T(""));
	for (int i = 0; i < vgetChar.size(); i++)
	{
		if (i == 0)
		{
			cstrTemp.Format(_T("%d"), vgetChar[i]);
		}
		else
		{
			cstrTemp.Format(_T(",%d"), vgetChar[i]);
		}
		strOutEditString = strOutEditString + cstrTemp;
	}
	GetDlgItem(IDC_EDIT3)->SetWindowTextW(strOutEditString);//显示到界面上第三个edit框中,输出为10进制数
}

运行结果:
MFC中将用户输入的表示16进制数的字符串转换成16进制数输出显示(包含1.wstring转成string的方法函数2.用boost库拆分字符串的函数3.字符转16进制数值的函数)
1.用户在第一个edit框中输入表示16进制数的字符串(每2个字符表示一个16进制数,并用英文形式的逗号分开)
2.点击“开始转换”按钮
3.在第二和第三个edit框中输出已被转换成16进制和10进制的数据