उपयोग 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 / स्टूल )। ये अनिवार्य रूप से संख्या रूपांतरण कार्यों के लिए C के स्ट्रिंग के आसपास पतले रैपर हैं, लेकिन जानते हैं कि कैसे निपटेंstd::string
तो, नए कोड के लिए सबसे सरल उत्तर शायद इस तरह दिखेगा:
std::string s = "0xfffefffe";
unsigned int x = std::stoul(s, nullptr, 16);
नोट: नीचे मेरा मूल उत्तर है, जो जैसा कहता है संपादित करें पूर्ण उत्तर नहीं है। एक कार्यात्मक समाधान के लिए, कोड के ऊपर कोड :-)।
ऐसा प्रतीत होता है कि चूंकि lexical_cast<>
स्ट्रीम रूपांतरण शब्दार्थ है। अफसोस की बात है कि धाराएँ "0x" अंकन को नहीं समझती हैं। इसलिए, boost::lexical_cast
मेरे और मेरे दोनों हाथ एक-एक करके हेक्स स्ट्रिंग्स से अच्छी तरह से नहीं जुड़े। उपरोक्त समाधान जो मैन्युअल रूप से इनपुट स्ट्रीम को हेक्स पर सेट करता है वह इसे ठीक से संभाल लेगा।
बूस्ट के पास ऐसा करने के लिए कुछ सामान है, जिसमें कुछ अच्छी त्रुटि जाँच क्षमता भी है। आप इसे इस तरह से उपयोग कर सकते हैं:
try {
unsigned int x = lexical_cast<int>("0x0badc0de");
} catch(bad_lexical_cast &) {
// whatever you want to do...
}
यदि आप बूस्ट का उपयोग करने का मन नहीं करते हैं, तो यहां लेक्सिकल कास्ट का एक हल्का संस्करण है, जिसमें कोई त्रुटि नहीं है:
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");