ใช้ 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;
std::cout << static_cast<int>(x) << std::endl;
}
ในมาตรฐาน C ++ 11 ใหม่มีฟังก์ชั่นยูทิลิตี้ใหม่บางอย่างที่คุณสามารถใช้ประโยชน์ได้! โดยเฉพาะอย่างยิ่งมีตระกูลของฟังก์ชัน "string to number" ( http://en.cppreference.com/w/cpp/string/basic_string/stolและhttp://en.cppreference.com/w/cpp/string/ basic_string / stoul ) สิ่งเหล่านี้เป็นกระดาษห่อบาง ๆ รอบ ๆ ฟังก์ชันการแปลงสตริงเป็นตัวเลขของ C แต่รู้วิธีจัดการกับไฟล์std::string
ดังนั้นคำตอบที่ง่ายที่สุดสำหรับโค้ดรุ่นใหม่อาจมีลักษณะดังนี้:
std::string s = "0xfffefffe";
unsigned int x = std::stoul(s, nullptr, 16);
หมายเหตุ:ด้านล่างนี้เป็นคำตอบเดิมของฉันซึ่งตามที่การแก้ไขระบุว่าไม่ใช่คำตอบที่สมบูรณ์ สำหรับวิธีแก้ปัญหาที่ใช้งานได้ให้ติดรหัสไว้เหนือบรรทัด :-)
ดูเหมือนว่าเนื่องจากlexical_cast<>
ถูกกำหนดให้มีความหมายของการแปลงสตรีม น่าเศร้าที่สตรีมไม่เข้าใจสัญลักษณ์ "0x" ดังนั้นทั้งboost::lexical_cast
มือของฉันและมือของฉันก็กลิ้งไปมาก็ไม่สามารถจัดการกับสตริง hex ได้ดี วิธีแก้ปัญหาข้างต้นซึ่งตั้งค่าสตรีมอินพุตเป็นฐานสิบหกด้วยตนเองจะจัดการได้ดี
Boost มีบางสิ่งที่ต้องทำเช่นกันซึ่งมีความสามารถในการตรวจสอบข้อผิดพลาดที่ดีเช่นกัน คุณสามารถใช้งานได้ดังนี้:
try {
unsigned int x = lexical_cast<int>("0x0badc0de");
} catch(bad_lexical_cast &) {
}
หากคุณไม่รู้สึกอยากใช้บูสต์นี่คือคำศัพท์เวอร์ชันเบาซึ่งไม่มีการตรวจสอบข้อผิดพลาด:
template<typename T2, typename T1>
inline T2 lexical_cast(const T1 &in) {
T2 out;
std::stringstream ss;
ss << in;
ss >> out;
return out;
}
ซึ่งคุณสามารถใช้ได้ดังนี้:
unsigned int x = lexical_cast<unsigned int>("0xdeadbeef");