MFC中将用户输入的表示16进制数的字符串转换成16进制数输出显示(包含1.wstring转成string的方法函数2.用boost库拆分字符串的函数3.字符转16进制数值的函数)
前期准备:
1.电脑中安装好boost库,我的电脑中安装在C盘根目录下,如下图所示:
2.配置好boost环境变量,如下图所示:
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进制数
}
运行结果:
1.用户在第一个edit框中输入表示16进制数的字符串(每2个字符表示一个16进制数,并用英文形式的逗号分开)
2.点击“开始转换”按钮
3.在第二和第三个edit框中输出已被转换成16进制和10进制的数据