c++中如何进行十六进制字符串转int_c++ 16进制转10进制方法

6次阅读

最稳妥的方法是直接使用 std::stoi 或 std::stoul;需显式指定进制 16,注意异常处理与类型匹配,避免 stringstream 状态残留和手动解析风险。

c++ 中如何进行十六进制字符串转 int_c++ 16 进制转 10 进制方法

直接用 std::stoistd::stoul 最稳妥,无需手写解析逻辑,也避开了 std::stringstream 的状态重置和异常处理陷阱。

std::stoi 转十六进制字符串到 int

适用于带或不带 "0x" 前缀的字符串,必须显式指定进制为 16;否则默认按十进制解析,"0xFF" 会变成 0(因为开头是 '0'stoi 会截断)。

  • std::stoi("FF", nullptr, 16)255
  • std::stoi("0xFF", nullptr, 16)255(前缀被自动识别并跳过)
  • std::stoi("ff", nullptr, 16)255(大小写不敏感)
  • 若字符串含非法字符(如 "FFG"),抛出 std::invalid_argument
  • 若值超出 int 范围(如 "FFFFFFFF" 在 32 位平台),抛出 std::out_of_range

处理超范围或不确定长度时用 std::stoulstd::stoull

当输入可能超过 int 表示范围(例如 64 位地址、哈希值),应选无符号长整型函数,并注意返回类型匹配:

  • unsigned long x = std::stoul("FFFFFFFF", nullptr, 16); → 正确(32 位系统上最大为 0xFFFFFFFFUL
  • unsigned long long y = std::stoull("10000000000000000", nullptr, 16); → 安全支持更大值
  • 别用 std::stoi 接收 "10000000000000000":在多数平台会抛 std::out_of_range

避免 std::stringstream 的隐式状态残留问题

很多人习惯写:

立即学习C++ 免费学习笔记(深入)”;

std::stringstream ss("FF"); int x; ss >> std::hex >> x;

这看似简洁,但有隐患:

  • 如果之前该 std::stringstream 实例发生过读取失败(比如空字符串或非数字),其 failbit 仍置位,后续 >> 操作直接失败,x 不变且无提示
  • std::hex 是流操纵符,影响后续所有整数读取,容易污染上下文
  • 不检查是否成功读完全部输入 —— "FFabc" 也会成功转出 255,而 stoi 遇到非法字符直接报错

手动解析仅在极端受限环境才考虑

嵌入式或禁用 标准库 时,需自行遍历字符串。关键点:

  • 跳过可选的 "0x""0X" 前缀
  • 每个字符映射:→ 0–9,或 'A''F' → 10–15
  • 每步执行 value = value * 16 + digit,并实时检查溢出(用 value > (UINT_MAX - digit) / 16 类判断)
  • 不推荐在常规项目中手写——易错、难维护、无错误位置信息

最常被忽略的是进制参数:漏传 16 就等于白转;其次是没处理异常,导致程序崩溃或静默错误。用 stoi/stoul 时务必包在 try 块里,尤其输入来自文件或用户时。

text=ZqhQzanResources