menggunakan std::stringstream
unsigned int x;
std::stringstream ss;
ss << std::hex << "fffefffe";
ss >> x;
contoh berikut menghasilkan -65538
sebagai hasilnya:
#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;
}
Dalam standar C ++ 11 yang baru, ada beberapa fungsi utilitas baru yang dapat Anda manfaatkan! khusus, ada keluarga fungsi "string ke nomor" ( http://en.cppreference.com/w/cpp/string/basic_string/stol dan http://en.cppreference.com/w/cpp/string/ basic_string / stoul ). Ini pada dasarnya adalah pembungkus tipis di sekitar string C ke fungsi konversi angka, tetapi tahu bagaimana menangani astd::string
Jadi, jawaban paling sederhana untuk kode yang lebih baru mungkin akan terlihat seperti ini:
std::string s = "0xfffefffe";
unsigned int x = std::stoul(s, nullptr, 16);
CATATAN: Di bawah ini adalah jawaban asli saya, yang seperti yang diedit mengatakan bukan jawaban yang lengkap. Untuk solusi fungsional, tempel kode di atas baris :-).
Tampaknya sejak lexical_cast<>
didefinisikan memiliki semantik konversi aliran. Sayangnya, stream tidak mengerti notasi "0x". Jadi boost::lexical_cast
tangan saya yang digulung tidak cocok dengan string hex. Solusi di atas yang secara manual mengatur input stream ke hex akan menanganinya dengan baik.
Boost juga memiliki beberapa hal untuk dilakukan, yang juga memiliki beberapa kemampuan pengecekan kesalahan yang bagus. Anda bisa menggunakannya seperti ini:
try {
unsigned int x = lexical_cast<int>("0x0badc0de");
} catch(bad_lexical_cast &) {
// whatever you want to do...
}
Jika Anda merasa tidak ingin menggunakan boost, inilah versi ringan dari pemeran leksikal yang tidak memeriksa kesalahan:
template<typename T2, typename T1>
inline T2 lexical_cast(const T1 &in) {
T2 out;
std::stringstream ss;
ss << in;
ss >> out;
return out;
}
yang dapat Anda gunakan seperti ini:
// though this needs the 0x prefix so it knows it is hex
unsigned int x = lexical_cast<unsigned int>("0xdeadbeef");