boost :: spirit :: qi - 这个十六进制解析有什么问题?

时间:2015-10-26 12:30:37

标签: c++ boost boost-spirit

请考虑以下代码:

{
        std::string input = "FFFFFFF";
        int result = 0;
        auto itBeg = input.cbegin();
        auto itEnd = input.cend();
        if(!bsq::parse(itBeg, itEnd, bsq::int_parser<int, 16>(), result) || itBeg != itEnd)
        {
            throw std::exception();
        }
        std::cout << input << " means " << result << std::endl;
    }
    {
        std::string input = "FFFFFFFF";
        int result = 0;
        auto itBeg = input.cbegin();
        auto itEnd = input.cend();
        if(!bsq::parse(itBeg, itEnd, bsq::hex, result) || itBeg != itEnd)
        {
            throw std::exception();
        }
        std::cout << input << " means " << result << std::endl;
    }
    {
        std::string input = "FFFFFFFF";
        int result = 0;
        auto itBeg = input.cbegin();
        auto itEnd = input.cend();
        if(!bsq::parse(itBeg, itEnd, bsq::int_parser<int, 16>(), result) || itBeg != itEnd)
        {
            throw std::exception();
        }
        std::cout << input << " means " << result << std::endl;
    }

第一个解析在0xFFFFFFF上正常工作(注意,7个十六进制数字) 第二个在0xFFFFFFFF上工作正常(8个十六进制数字) 第三个失败了,我不明白为什么。 isnt int_parser<T, 16>与bsq :: hex基本相同?
住在Coliru

1 个答案:

答案 0 :(得分:3)

  

第三个失败,我无法理解为什么

您正在使用已签名的解析器,并且会遇到类型宽度边界。将其更改为:

bsq::uint_parser<unsigned int, 16>(), result)

live demo

  

不是int_parser<T, 16>bsq::hex基本相同?

没有

The documentationboost::spirit::qi::hex

  

使用 [..] radix 16解析无符号整数