如何在C++中将十六进制字符串转换为long long类型
解决十六进制字符串转long long的问题
哈哈,这个坑我之前踩过!你遇到的核心问题是默认的转换函数都默认按十进制解析字符串,但你的"0005105C9A84BE03"是十六进制格式,而且长度刚好对应64位整数,得指定基数才能正确转换。下面给你两种靠谱的解决方法:
方法1:使用C风格的strtoll函数
之前你用strtoll没成功,大概率是没指定第三个参数(基数)。只要把基数设为16,就能正确解析十六进制字符串:
#include <cstdlib> #include <string> #include <iostream> int main() { std::string myString = "0005105C9A84BE03"; // 第三个参数16表示按十六进制解析字符串 long long myVar = strtoll(myString.c_str(), nullptr, 16); std::cout << myVar << std::endl; // 输出:1425364798979587 return 0; }
解释一下:strtoll是专门处理64位整数的转换函数,nullptr表示不需要记录转换终止的位置,基数16会让函数识别十六进制的字符(A-F、a-f)。
方法2:使用C++11及以后的std::stoll函数
如果更习惯C++风格的写法,用std::stoll更贴合字符串操作,同样需要指定基数16:
#include <string> #include <iostream> int main() { std::string myString = "0005105C9A84BE03"; long long myVar = std::stoll(myString, nullptr, 16); std::cout << myVar << std::endl; // 输出预期值 return 0; }
为什么之前的函数都失败了?
给你捋一下原因:
atoi/stoi:不仅默认按十进制解析,而且返回的是int类型(通常32位),你的目标值远超过32位整数的最大值(约2e9),直接溢出或解析错误。strtol:返回的是long类型,很多平台上long还是32位,存不下64位的目标值;而且没指定基数的话,遇到十六进制字符(比如C、A)会直接停止解析,得到错误结果。
内容的提问来源于stack exchange,提问作者RandomGuy
相关产品推荐
相关产品推荐

