将包含整数的字符串与包含十六进制的字符串进行比较的最简单方法

Posted

技术标签:

【中文标题】将包含整数的字符串与包含十六进制的字符串进行比较的最简单方法【英文标题】:The easiest way to compare string containing integer to string containing hex 【发布时间】:2013-03-16 11:59:56 【问题描述】:

我有两个字符串,一个是整数(例如字符串 strInt = "100"),一个是十六进制数字(例如字符串 strHex = "0x64")。 如果 strInt 和 strHex 的值相等(数字),比较最快/最好/安全的方法是什么?

需要排除 sprintf 以防止缓冲区溢出 也不能使用 snprintf - 我的编译器不支持 c++ 11

提前谢谢大家

【问题讨论】:

这里的关键信息是位数,你把它漏掉了 当然这需要在 C++ 中完成 :) 十六进制格式为 0xyyyyy - 所以 5 个数字 那个十六进制数不也是整数吗?你的意思是“十进制”吗? 【参考方案1】:

使用strtol 将两者都转换为整数,然后进行比较。您可以使用strHex.c_str()将c++字符串转换为strtol所需的c风格字符串。

例子:

long int numHex = strtol(strHex.c_str(),NULL,16); // 16 is the base of the source

long int numInt = strtol(strInt.c_str(),NULL,10);

【讨论】:

【参考方案2】:

我看不出这需要sprintf()snprintf() 函数。

std::string a = "1337";
std::string b = "0x539";

std::stringstream as;
as.str(a);
std::stringstream bs;
bs.str(b);

int na, nb;
as >> na;
bs >> std::hex >> nb;

std::cout << a << " is " << (na == nb ? "equal" : "not equal") << " to " << b << std::endl;

【讨论】:

我正在考虑这样做 - 但这是最​​优的吗?似乎需要大量内存来创建两个字符串流只是为了比较两个数字??? @marcin 看看建议使用strtol() 的答案很快就会被大量否决:P 如果你有一个好的优化编译器,这应该不是问题,并且通常使用 C++ 代码当你用 C++ 写东西时,更喜欢使用 C。 @H2CO3 想解释一下为什么? (老实说,我不知道,否则不会建议) @H2CO3 不太相信使用 stringstream 而不是 strtol... 但毕竟这似乎是一个更安全的选择 @H2CO3:在这种情况下,安全选项是strtol。在 C++11 中,这就是流内部使用的内容。在 C++03 中,他们改为使用 fscanf 系列,在某些情况下使用 Undefined Behavior,特别是从十六进制转换......所以,在这种情况下,使用更高级别功能的一般准则,导致选择明显劣质的解决方案:更不安全、更低效、更冗长。 :-) 只有在节省工作时才使用更高级别的解决方案。

以上是关于将包含整数的字符串与包含十六进制的字符串进行比较的最简单方法的主要内容,如果未能解决你的问题,请参考以下文章

Ruby String:存储包含反斜杠和十六进制表示法的字符串

Shell脚本比较两个网段是否存在包含与被包含的关系

Shell脚本比较两个网段是否存在包含与被包含的关系

Swift将十六进制字符串或字符转换为整数

Java基本数据类型与类型转换

415. 字符串相加(Python)