在c++编程中,十六进制字符串转int是常见的数据转换需求,比如处理串口通信返回的十六进制数据、解析协议中的十六进制字段时都需要用到这类转换。不同的转换方式有不同的适用场景,下面逐一介绍。

方法一:使用标准库函数stoi
c++11及之后的标准库提供了stoi函数,可以直接实现字符串到整数的转换,通过指定进制参数就能完成十六进制字符串转int的操作,使用起来非常简便。
stoi的函数原型为:
int stoi(const string& str, size_t* idx = 0, int base = 10);
其中第三个参数base就是进制数,设置为16即可表示将字符串按十六进制解析。如果字符串以0x或者0X开头,也可以正常识别。
示例代码如下:
#include <iostream>
#include <string>
using namespace std;
int main() {
string hexStr1 = "1A3F";
string hexStr2 = "0xFF";
int num1 = stoi(hexStr1, nullptr, 16);
int num2 = stoi(hexStr2, nullptr, 16);
cout << "hexStr1转换结果:" << num1 << endl;
cout << "hexStr2转换结果:" << num2 << endl;
return 0;
}
运行后输出结果为:
hexStr1转换结果:6719 hexStr2转换结果:255
需要注意的是,如果字符串中包含非十六进制的字符,stoi会抛出invalid_argument异常,如果转换结果超出int的范围,会抛出out_of_range异常,实际使用时建议添加异常处理逻辑。
方法二:使用stringstream字符串流
如果需要兼容c++11之前的版本,或者需要更灵活的流操作,可以使用stringstream配合输入输出格式控制来完成转换。通过hex操纵符可以指定输入为十六进制格式。
示例代码如下:
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
int main() {
string hexStr = "2B7C";
stringstream ss;
int result;
ss << hex << hexStr;
ss >> result;
cout << "转换结果:" << result << endl;
return 0;
}
运行后输出结果为:
转换结果:11132
这种方式的优点是不需要额外处理异常,如果字符串格式错误,流的状态会变为失败,可以通过检查流状态判断转换是否成功。如果字符串以0x开头,同样可以正常识别。
方法三:手动实现转换逻辑
如果需要在没有标准库支持的环境(比如某些嵌入式场景)下实现转换,也可以手动编写转换逻辑。核心思路是遍历字符串的每个字符,将每个十六进制字符转换为对应的数值,再按位累加计算最终结果。
示例代码如下:
#include <iostream>
#include <string>
#include <cctype>
using namespace std;
// 将单个十六进制字符转换为对应的数值
int charToValue(char c) {
if (c >= '0' && c <= '9') {
return c - '0';
} else if (c >= 'a' && c <= 'f') {
return c - 'a' + 10;
} else if (c >= 'A' && c <= 'F') {
return c - 'A' + 10;
}
return -1; // 非法字符
}
int hexStringToInt(const string& hexStr) {
int result = 0;
int start = 0;
// 跳过开头的0x或者0X
if (hexStr.size() > 2 && hexStr[0] == '0' && (hexStr[1] == 'x' || hexStr[1] == 'X')) {
start = 2;
}
for (int i = start; i < hexStr.size(); i++) {
int val = charToValue(hexStr[i]);
if (val == -1) {
// 处理非法字符,这里简单返回-1表示错误,实际可按需调整
return -1;
}
result = result * 16 + val;
}
return result;
}
int main() {
string hexStr1 = "3C";
string hexStr2 = "0x1F";
cout << "hexStr1转换结果:" << hexStringToInt(hexStr1) << endl;
cout << "hexStr2转换结果:" << hexStringToInt(hexStr2) << endl;
return 0;
}
运行后输出结果为:
hexStr1转换结果:60 hexStr2转换结果:31
手动实现的方式可以完全控制转换逻辑,方便添加自定义的校验规则,但是需要注意处理int溢出的问题,上面的示例代码没有做溢出处理,实际使用时可以根据需求补充。
不同方法的对比
三种方法的适用场景各有不同,下面是简单的对比:
| 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| stoi函数 | 代码简洁,使用简单 | 需要c++11及以上版本,需要手动处理异常 | 常规c++11及以上项目,需要快速实现转换的场景 |
| stringstream | 兼容性好,无需处理异常 | 代码稍多,性能略低于stoi | c++11之前的项目,或者需要流操作的场景 |
| 手动实现 | 无依赖,可自定义逻辑 | 需要自己处理各种边界情况,容易出bug | 无标准库支持的嵌入式场景,需要自定义转换规则的场景 |
实际开发中可以根据项目的具体需求和运行环境选择合适的转换方法,优先使用标准库提供的方法,减少重复造轮子带来的问题。
C++十六进制字符串转int16进制转10进制stoistringstream修改时间:2026-06-19 15:42:39