最近工作上遇到的一个问题,字符串需要转成十六进制数处理,例如:
“ABCD”字符串,实际需要用作0xABCD,来进行处理。
如果是短字符串,可以用C++支持的stoi函数来进行转换,例如:
string mystr = "ABC";
size_t index = 0;
int myintvalue = stoi(mystr, &index, 16);
这里用16表示16进制,如果用10(或者默认就是10)将会抛出异常. 因为A无法用十进制进行转换。 但是这种方法也只是适用于短一点的字符串,长字符串会因为无法存储这么大的数据而报错。
首先C++中定义一个长字符串:
string mystr = "001607530ABBFF00FE8000D007010103112B";
然后可以把里面每一个字符强制转换(int),以第一个字符为例:
int myintvalue = (int)mystr[0];
但是把myintvalue值输出出来发现,为什么这个值是48,这是因为将字符强制转换整型获得的是该字符对应的ASCII值。 所以只需要将ASCII值和整型值对应起来处理即可,如下函数:
int convstrtoint(int myvalue)
{
if (myvalue >= 65 && myvalue <= 70) //转换A~F
{
myvalue -= 55;
}
else if (myvalue >= 48 && myvalue <= 57) //转换0~9
{
myvalue -= 48;
}
else if (myvalue >= 97 && myvalue <= 102) //转换a~f
{
myvalue -= 87;
}
else
{
std::cout << "Data is out of scrop"<< endl;
}
return myvalue;
}
我们可以用一个整型数组来存储由字符串转换过来的值,如下:
int* myintvalue = new [mystr.length()];
for (unsigned int i = 0; i < mystr.length(); i++)
{
myintvalue[i] = convstrtoint((int)mystr[i]);
}
delete[] myintvalue;
myintvalue = nullptr;
上述过程也可以使用只能指针来完成,如下:
auto myintvalue = make_unique
for (unsigned int i = 0; i < mystr.length(); i++)
{
myintvalue[i] = convstrtoint((int)mystr[i]);
}
这样就不需要delete来释放内存了。
// 如果想把这样的整数型数组转换成相对应的十六进制字符串,先定义下面函数:
string convinttostr(int myvalue)
{
string mychar;
if (myvalue >= 0 && myvalue <= 9)
{
mychar = to_string(myvalue);
}
else if (myvalue >= 10 && myvalue <= 15)
{
switch (myvalue)
{
case 10:
mychar = "A";
break;
case 11:
mychar = "B";
break;
case 12:
mychar = "C";
break;
case 13:
mychar = "D";
break;
case 14:
mychar = "E";
break;
case 15:
mychar = "F";
break;
default:
break;
}
}
else
{
std::cout << "Data is out of scrop" << endl;
}
return mychar;
}
函数返回的是string行字符串,通过循环把所有的相加就构成了长字符串了,因为string型字符串支持+运算符的。



