使用する 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)。これらは本質的にCの文字列から数値への変換関数の薄いラッパーですが、std::string
したがって、新しいコードの最も簡単な答えはおそらく次のようになります。
std::string s = "0xfffefffe";
unsigned int x = std::stoul(s, nullptr, 16);
注:以下は私の元の回答です。編集によると、これは完全な回答ではありません。機能的な解決策として、コードを行の上に貼り付けます:-)。
以降のように見えるlexical_cast<>
ストリーム変換セマンティクスを持つように定義されています。悲しいことに、ストリームは「0x」表記を理解できません。ですからboost::lexical_cast
、私の手で転がしたものも、16進数の文字列をうまく扱えません。入力ストリームを手動で16進数に設定する上記のソリューションは、それをうまく処理します。
Boostにはこれを行うためのいくつかの機能があり、これには優れたエラーチェック機能もあります。次のように使用できます。
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");