我正在尝试处理一些输入。它应该是数字或程序将抛出异常。但是数字的格式是不确定的,这意味着它可能是正常的十进制数(基数10),如123,或十六进制数(基数16),如0x123。我想将它们转换为32位无符号整数。
如何才能简单快捷地实现目标?
事实上,我正在编写汇编程序并尝试解码像DD 0x1, 0x2
这样的伪指令。
另一个问题是,如何将纯文本中带有“\ x01”的字符转换为C ++中等于'\ x01'的真实字符类型变量?
如果它是一个字符串怎么办?如何将它们摘出来?
答案 0 :(得分:2)
我只对问题的第一部分感兴趣:如何根据前缀的高效和快速读取数值。简单的回答是利用标准C ++库设施进行数值解析(BTW,我完全了解%i
格式说明符,但我没有倾向于宣传C&C的数字设施解析):清除std::ios_base::basefield
时,将根据前缀
0x
=>十六进制0
=>八进制这是一个展示此功能的简短程序::
#include <iostream>
#include <sstream>
int main()
{
std::istringstream in("0x123 0123 123");
in.setf(std::ios_base::fmtflags(), std::ios_base::basefield);
for (int i; in >> i; ) {
std::cout << "read " << i << "\n";
}
}
答案 1 :(得分:1)
还有另一种选择,而不是Dietmar指出的。它的工作方式相同:将流的数字基数设置为0,这对应于十进制输出和前缀相关的输入:
0x - 十六进制
0 - 八进制
否则 - 十进制
#include <iostream>
#include <sstream>
#include <iomanip>
using namespace std;
int main() {
std::istringstream s("10 0x10 010");
s >> std::setbase(0);
for (int i; s >> i; ) {
std::cout << "read " << i << "\n";
}
return 0;
}
结果:
阅读10
阅读16
阅读8