boost :: spirit :: qi — что не так с этим шестнадцатеричным разбором?

Рассмотрим следующий код:

{
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

2

Решение

третий терпит неудачу, и я не могу понять, почему

Вы используете подписанный парсер и достигаете границы ширины шрифта. Измените это на:

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

(живое демо)


разве int_parser<T, 16> по сути такой же, как bsq::hex?

Нет.

Документация Говорит, что boost::spirit::qi::hex будут

Разобрать целое число без знака с помощью [..] основание 16

2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector