использование std::stringstream
unsigned int x;
std::stringstream ss;
ss << std::hex << "fffefffe";
ss >> x;
следующий пример выдает в -65538
качестве результата:
#include <sstream>
#include <iostream>
int main() {
unsigned int x;
std::stringstream ss;
ss << std::hex << "fffefffe";
ss >> x;
// output it as a signed type
std::cout << static_cast<int>(x) << std::endl;
}
В новом стандарте C ++ 11 есть несколько новых служебных функций, которые вы можете использовать! в частности, существует семейство функций «строка в число» ( http://en.cppreference.com/w/cpp/string/basic_string/stol и http://en.cppreference.com/w/cpp/string/ basic_string / stoul ). По сути, это тонкие обертки вокруг функций преобразования строк в числа в Си, но они знают, как обращаться сstd::string
Итак, самый простой ответ для более нового кода, вероятно, будет выглядеть так:
std::string s = "0xfffefffe";
unsigned int x = std::stoul(s, nullptr, 16);
ПРИМЕЧАНИЕ. Ниже приведен мой первоначальный ответ, который, как говорит редакция, не является полным ответом. Для функционального решения вставьте код над строкой :-).
Похоже, что так lexical_cast<>
как определено, чтобы иметь семантику преобразования потока. К сожалению, потоки не понимают нотацию «0x». Так что boost::lexical_cast
и моя, и моя рука свернуты не очень хорошо с шестнадцатеричными строками. Вышеупомянутое решение, которое вручную устанавливает входной поток в шестнадцатеричный формат, прекрасно с этим справится.
У Boost есть кое-что для этого, а также есть хорошие возможности проверки ошибок. Вы можете использовать это так:
try {
unsigned int x = lexical_cast<int>("0x0badc0de");
} catch(bad_lexical_cast &) {
// whatever you want to do...
}
Если вы не хотите использовать boost, вот облегченная версия лексического приведения, которая не проверяет ошибки:
template<typename T2, typename T1>
inline T2 lexical_cast(const T1 &in) {
T2 out;
std::stringstream ss;
ss << in;
ss >> out;
return out;
}
который вы можете использовать так:
// though this needs the 0x prefix so it knows it is hex
unsigned int x = lexical_cast<unsigned int>("0xdeadbeef");