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

3

Consider following code:

{
        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个十六进制数字)上也能正常工作, 但第三个解析器失败了,我不明白为什么。难道int_parser<T, 16>不是与bsq::hex基本相同吗?
在线演示请访问Coliru

1个回答

3

第三个失败了,我不知道为什么

您正在使用有符号解析器,并且遇到类型宽度边界。请将其更改为:

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

(现场演示)


int_parser<T, 16>和bsq::hex本质上是一样的吗?

不是。

文档中说明,boost::spirit::qi::hex将会

使用[..]基数为16解析一个无符号整数


如果我想将其解析为有符号整数怎么办?我希望在这里得到-1。 - kreuzerkrieg
1
@kreuzerkrieg:点击标有“实时演示”的链接。 - Lightness Races in Orbit
顺便说一下,我刚刚检查了一下,bsq::parse(itBeg, itEnd, bsq::hex, result) 会用 -1 填充结果,这让我非常困惑。在你的演示中,bsq::uint_parser 的 uint-ness 属于输入还是结果? - kreuzerkrieg
1
解析器的uint-ness"属于解析器的uint-ness。句号。解析器解析一个无符号整数。您稍后将属性转换为有符号后,只需调用标准转换即可(在这种情况下是一个简单的static_cast<>)。没有什么神奇的。这恰好就像c++中的简单赋值 unsigned u = 0xFFFFFFFFF; int i = u;甚至int i = 0xFFFFFFFF; - sehe
@sehe:对,但我猜他想知道为什么0xFFFFFFFF不能被解释为-1并在第一时间由int_parser解析。 我猜这是因为我们谈论的是值,而不是字节表示? - Lightness Races in Orbit
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接