• ベストアンサー

boost::lexical_castで16進数文字列を数値に変換する

boost::lexical_castで16進数文字列を数値に変換する 次のコードで試しましたが実行時例外になります。 16進数文字列をlexical_castで扱う方法を教えてください。 #include <boost/lexical_cast.hpp> string ss = "0x1234"; int n = boost::lexical_cast<int>(ss); よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • jacta
  • ベストアンサー率26% (845/3158)
回答No.1

原則として無理なので、strtolを使ってください。 int n; errno = 0; char* endptr; long temp = std::strtol(ss.c_str(), &endptr, 0); if (errno != 0 || temp < std::numeric_limits<int>::min() || std::numeric_limits<int>::max() < temp || *endptr != '\0') {  // エラー処理 }

zuntac
質問者

お礼

回答、ありがとうございます。 代替えコードを参考にさせていただきます。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • qwertfk
  • ベストアンサー率67% (55/81)
回答No.2

こんな感じで無理すれば出来なくは無いです。 #include <sstream> #include <iomanip> #include <boost/lexical_cast.hpp> template<typename DST> struct hex_to {  operator DST(void) const  {   return value;  }  DST value; }; template<typename DST> std::istream& operator>>( std::istream& ist , hex_to<DST>& h ) {  std::string s;  ist >> std::hex >> h.value;  return ist; } int main(int argc, char* argv[]) {  int i = boost::lexical_cast< hex_to<int> >("0xff");  std::cout << i << std::endl;  getchar();  return 0; } ただ、ちょっと複雑すぎるので出来れば避けたほうが良いような気はします。

zuntac
質問者

お礼

回答、ありがとうございます。 詳しいコードを示していただき恐縮です。参考にさせていただきます。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 数値を文字列に変換する?

    下のプログラムでなぜString ss= " "+dt;のように数値を文字列に変換しないとだめなんでしょうか? ちなみに桁数設定メソッドを作るプログラムです。 public class JcWidth { // JcWidth.java [java] public static void main(String args[]) { System.out.println(":" + toIntWidth(123, 8) + ":"); System.out.println(":" + toIntWidth(12345, 8) + ":"); System.out.println(":" + toIntWidth(-1234567890, 8) + ":"); System.out.println(":" + toHexWidth(4095, 8) + ":"); System.out.println(":" + toHexWidth(123456789, 8) + ":"); } // int値dtを先行空白付きw桁(最大12)の表現にする // 数値が指定幅より大きいときは必要な幅にする public static String toIntWidth(int dt, int w) { if (w > 12) w = 12; String ss = "" + dt; // 数値を文字列にする if (ss.length() > w) w = ss.length(); ss = " " + dt; return ss.substring(ss.length()-w); } // int値dtを先行0付きw桁(最大8)の16進数大文字表現にする public static String toHexWidth(int dt, int w) { if (w > 8) w = 8; String ss = Integer.toHexString(dt).toUpperCase(); if (ss.length() > w) w = ss.length(); ss = "0000000" + ss; return ss.substring(ss.length()-w); } } 

    • ベストアンサー
    • Java
  • 数値を文字列として結合した結果を数値に変換する

    お世話になっております。 プログラムで、文字を結合した結果を数値に変換する処理にて 処理を高速化できる記述方法があるか質問させてください。 ・やりたいこと  複数の数値を文字列として結合した結果を数値型に高速で変換したい。 ・現在のコード(考え方 C#にて)  今、以下のように数値変換しているのですが、  これ以外の書き方で、スマートな方法はないでしょうか?  ※結果がわかりやすいように変数はその都度宣言しています。 int i1 = "10"; int i2 = "2"; string sConcat = i1.ToString() + i2.ToString() ; // "102" // To Int int convertedInt = int.Parse( sConcat ) ; //102 // To Hex int convertedHex = Convert.ToInt32( sConcat , 16 ); // 0x102 数値を文字にして結合して・・・またキャストというのが 無駄なような気がしています。 すみませんが、良い方法があればご教授ください。

  • 数値から2進数の文字列変換

    ある数値を2進数の文字列に変換したい関数を作りたいのですが、うまく出来ません。 2進数表示させるのに、シフト演算を使いたいのですがうまくいきません。 ヒントでもいいのでおしえてください。 ↓いちよう作ろうとしているプログラムです。 char *a(int atai){ int amari; char moji=0; while (atai != 0) { amari = atai % 2; atai = atai / 2; /*2進数表示させたい*/ } return moji;

  • std::wstringの継承

    #include<iostream> #include<string> #include <stdlib.h> #include <locale.h> #include <boost/lexical_cast.hpp> using boost::lexical_cast; using namespace std; VisualC++2008ExpressEditionで文字や数字を簡単に扱えるクラスを今作ろうとしていて以下のように作ってみました。 class multiString:public std::wstring{ public:   multiString(const wchar_t *ws){     /* multiString class自体に代入 */   } }; しかし、このwchar_tをクラスに代入する処理として、 multiString(const wchar_t *s)std::wstring(s); とすると、「error C2082: 仮パラメータ 's' が再定義されました。」となりますし、 multiString(const wchar_t *s)*this=s; とすると、例外が発生してしまします。 wstringだったら、簡単に代入処理として出来るのですが、継承した場合はどの様に実装すればいいのでしょうか? 宜しくお願いします。

  • clangで例外がキャッチできない?

    初質問です.yahooでも質問したのですがこちらでもしておきます. 趣味でプログラミングをしているものです.clang(コンパイラです)はエラーメッセージが分かりやすいので使っていたのですがg++と挙動が違うようです. 以下のソースのようにC++でboost::lexical_castを使おうとしたのですが,変換に失敗した際に,g++では例外をキャッチしてくれるのにclang(コンパイラです)ではキャッチしてくれず,実効停止してしまうようです.コンパイラオプションの問題でしょうか? ~ ソース test3.cpp ~ #include <iostream> #include <boost/lexical_cast.hpp> #include <string> using namespace std; int main() {     cout << "start" << endl; try { throw 10; // これはキャッチしてくれる } catch (int i) { cout << "thrown:" << i << endl; } cout << "and..." << endl; string str = "not a number"; try { int error = boost::lexical_cast<int>(str); } catch(boost::bad_lexical_cast& e) { // 以下,clangだと全部スルー? cout << "bad_lexical_cast!!" << endl; cout << e.what() << endl; } catch(exception& e) { cout << "exception!!" << endl; cout << e.what() << endl; } catch(...) { cout << "exception!?" << endl; cout << "error" << endl; } cout << "end" << endl; } ~ コンパイル&実行 ~ > clang test3.cpp -lstdc++ -I"C:\Program Files (x86)\boost\boost_1_47" > a.out start thrown:10 and... This application has requested the Runtime to terminate it in an unusual way. Please contact the application's support team for more information. > g++ test3.cpp -I"C:\Program Files (x86)\boost\boost_1_47" > a.exe start thrown:10 and... bad_lexical_cast!! bad lexical cast: source type value could not be interpreted as target end > ~ 環境 ~ OS:Windows 7 clang:version 3.1 g++(mingw):version 4.6.1(あ,でもインストール適当なんで4.7とかとかぶってるかもです) boost:version 1.4.7(1.0っていうんですかね?) 何か激しく勘違いをしている可能性もあるのでお暇な方はどうぞ教えてください. P.S. なんとインデントが消えてしまうのですね!

  • 文字列の加算

    OS  :WindowsXP Pro SP1 開発環境:VisualStudio .NET 2003 開発言語:C# 開発形態:Windowsアプリケーション プログラミング初心者です。どうかよろしくお願い致します。 現在、あるアプリケーションを作成しております。 その中で、数値の入った文字列を受け取り、それを全て加算しようとしております。 例えば、 引数の文字列が"123456789"だとしたら、そのメソッド内で1+2+3+4+5+6+7+8+9を計算し、答えを返却値とする。 私は文字列をint型にキャストして計算しようと思ったのですが、うまくキャストできません。string型はint型にキャストできないのでしょうか? また他に文字列の数値の加算をする方法がありましたら、どなたかご教授お願い致します。

  • 数値を文字列に変換する方法

    int rssi_dec = Convert::ToInt32("0X" + test02, 16); -----------(中略)----------------------- 一度、文字列だったものを数値に変換して、中略部分で計算をして、もう一度数値をHEXの 文字列に変換して、 String^ test このtestの中に代入したいと思っているのですが、どのようにすればよいのでしょうか? どうぞ、ご教授よろしくお願い致します。

  • 数値を2進数文字列に変換するものなんですが・・・

    数値を2進数の文字列に変換するプログラムを関数として作成しているんですが、わからないことがあるのでお願いします。 char *itob(int value, int size, char binary[]) { int count = 0; /* binaryの添え字 */ int bit = size * 8; /* ビットになおす */ int mask = 1 << bit - 1; /* 先頭ビットに1を立てる */ /* 数値を2進数の文字列に変換する処理 */ do { if(value & mask) { /* valueとmaskのAND(論理積) */ binary[count] = '1';/* '1'を代入 */ }else { binary[count] = '0';/* '0'を代入 */ } value <<= 1; /* valueを左へ1ビットシフト */ count++; /* countを1たす */ }while(count < bit); /* 繰り返しを行う条件 */ binary[count] = '\0'; /* 最後に'\0'を入れる */ return binary; /* 変換した値を戻り値として返す */ } この前にもプログラムがありますが、コンパイルして実行する際に 10001 1110 と入力したら、 11111 という答えを出したいのですが、 これを実行すると、 00000000000000000000000000011111 となってしまいます。 これを11111とするためにはプログラムにどのような処理をすればよいのかわかりませんのでどなたかおわかりのかた解説をお願いします。

  • Informixで文字列を数値型に

    こんにちは。 当方、Linux7.3+アプリケーション(DB:Informix)を使用しています。 文字列を数値に変換するSQLに悩まされています。 内容 01/01/08からなる文字列と20080101と手動入力される数値を比較する事が最終目標です。 当方が試みている方向は、 01/01/08をSUBSTRING()で20080101に成型し、数値比較をしたい、と思っています。 SUBSTRING()で、文字列型で20080101までできるのですが、数値型にCASTが出来ません。 検討した関数は、下記の通りですが、構文エラーとなり、実装できません。 お助け下さい。 CAST(20080101) as INTEGER TO_NUMBER(20080101) INT(20080101) CONVERT(20080101)

  • 8進数文字列を10進数の数値にする方法

    文字列の数値を10進数に変換したいのですが、 頭に0が付くと8進数扱いでエラーになります。 簡単に変換する方法はありますか? my $a = "09"; my $b = int($a); <-- エラー また、8進数は頭に0ですが 2進数はどんな表記方法でしょうか?

    • ベストアンサー
    • Perl