如何使用C ++以不确定的数字和字符格式处理?

时间:2014-06-07 13:26:38

标签: c++ assembly

我正在尝试处理一些输入。它应该是数字或程序将抛出异​​常。但是数字的格式是不确定的,这意味着它可能是正常的十进制数(基数10),如123,或十六进制数(基数16),如0x123。我想将它们转换为32位无符号整数。

  1. 如何才能简单快捷地实现目标?

    事实上,我正在编写汇编程序并尝试解码像DD 0x1, 0x2这样的伪指令。

  2. 另一个问题是,如何将纯文本中带有“\ x01”的字符转换为C ++中等于'\ x01'的真实字符类型变量?

  3. 如果它是一个字符串怎么办?如何将它们摘出来?

2 个答案:

答案 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