kullanım std::stringstream
unsigned int x;
std::stringstream ss;
ss << std::hex << "fffefffe";
ss >> x;
aşağıdaki örnek -65538
bunun sonucunda ortaya çıkar:
#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;
}
Yeni C ++ 11 standardında, yararlanabileceğiniz birkaç yeni yardımcı program işlevi vardır! özellikle, "string to number" işlevlerinden oluşan bir aile vardır ( http://en.cppreference.com/w/cpp/string/basic_string/stol ve http://en.cppreference.com/w/cpp/string/ basic_string / stoul ). Bunlar esasen C'nin sayı dönüştürme fonksiyonuna dizesi etrafındaki ince sargılardır, ancak birstd::string
Yani, yeni kod için en basit cevap muhtemelen şöyle görünecektir:
std::string s = "0xfffefffe";
unsigned int x = std::stoul(s, nullptr, 16);
NOT: Aşağıda, düzenlemenin söylediği gibi tam bir cevap olmayan orijinal cevabım yer almaktadır. İşlevsel bir çözüm için, kodu satırın üstüne yapıştırın :-).
O zamandan beri lexical_cast<>
, akış dönüşüm semantiği olduğu tanımlanmıştır. Maalesef akışlar "0x" gösterimini anlamıyor. Yani hem boost::lexical_cast
benim hem de elimden biri altıgen dizelerle iyi başa çıkmıyor. Giriş akışını el ile onaltılık değere ayarlayan yukarıdaki çözüm, iyi işleyecektir.
Boost da bunu yapmak için bazı şeyler var , bu da bazı güzel hata kontrol yetenekleri vardır. Bu şekilde kullanabilirsiniz:
try {
unsigned int x = lexical_cast<int>("0x0badc0de");
} catch(bad_lexical_cast &) {
// whatever you want to do...
}
Güçlendirme kullanmak istemiyorsanız, hata kontrolü yapmayan, lexical cast'ın hafif bir sürümü:
template<typename T2, typename T1>
inline T2 lexical_cast(const T1 &in) {
T2 out;
std::stringstream ss;
ss << in;
ss >> out;
return out;
}
Bu şekilde kullanabilirsiniz:
// though this needs the 0x prefix so it knows it is hex
unsigned int x = lexical_cast<unsigned int>("0xdeadbeef");