VC++: ソースコードから16進数のみ抽出

このQ&Aのポイント
  • 「VC++: ソースコードから16進数のみ抽出」というタイトルで、C++のソースコードから16進数のみを抽出したいと質問しています。
  • C#からC++への変換を試みている質問者ですが、摘出方法Aでは実行時エラーが発生し、摘出方法Bではコンパイルエラーが発生しています。
  • コードの修正についてアドバイスを求めています。
回答を見る
  • ベストアンサー

VC++: ソースコードから16進数のみ抽出

前略  "C#: ソースコードから16進数のみ抽出"の質問をしたものです。 この質問にからんだプログラムは.NET VC++ 2012で製作中です。 最近はC#をやっている人が圧倒的に多くなっていることから回答を得やすいC#で回答をもらい C#のプログラムをC++に変更して使おうと考え C#で質問した次第です。  C#の場合と同様に <摘出前>の文字列を データだけの<摘出後>の文字列にしたいと思っています。先ほどから それぞれご教示いただいたC#のコードをもとに C++化した 摘出方法Aと摘出方法Bについてトライしているのですが  (1)摘出方法Aはコンパイルはできるが ”MatchはResultを呼びだせません"と云う実行エラーがでる。  (2)摘出方法Bは ”stringは定義されていない識別子です”と云うコンパイルエラーがでる。 といった状況で困っています。先ほどからいろいろやっているのですがうまくゆきません。  コードの修正等 具体的にアドバイスいただければ幸いです。 以上、よろしくお願いします。 <摘出方法A> Regex^ re = gcnew Regex("\{(?<moji>[0-9A-Fa-fx\r\s,]+)\}"); String^ st = re->Match(richTextBox1->Text)->Result("${moji}")->TrimStart()->TrimEnd(); MessageBox::Show(st); <摘出方法B> Regex^ r = gcnew Regex("0x[0-9a-fA-F][0-9a-fA-F],( |\r\n)", System::Text::RegularExpressions::RegexOptions::IgnoreCase); Match^ m = r->Match(richTextBox1->Text); richTextBox1->Text = string->Empty; while (m->Success) { richTextBox1->Text += m->Value; m = m->NextMatch(); } //-------抽出前-------------- #include "Graphics.h" #ifdef USE_GOL #if(GRAPHICS != 0x0306) #warning "use Graphics Library version 3" #endif #if defined __XC32__ extern const char __GOLFontDefault[] ; const FONT_FLASH GOLFontDefault = { (FLASH | COMP_NONE), }; const char __GOLFontDefault[] = { 0x00, 0x00, 0x1C, 0x00, 0x7E, 0x00, 0x1B, 0x00, 0x10, 0x94, 0x01, 0x00, 0x10, 0xCA, 0x01, 0x00, 0x11, 0x00, 0x02, 0x00, 0x11, 0x51, 0x02, 0x00, 0x05, 0xA2, 0x02, 0x00, }; #endif //-------抽出後------------- 0x00, 0x00, 0x1C, 0x00, 0x7E, 0x00, 0x1B, 0x00, 0x10, 0x94, 0x01, 0x00, 0x10, 0xCA, 0x01, 0x00, 0x11, 0x00, 0x02, 0x00, 0x11, 0x51, 0x02, 0x00, 0x05, 0xA2, 0x02, 0x00,

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

  • ベストアンサー
  • mk48a
  • ベストアンサー率56% (1133/2007)
回答No.2

回答者はあなたの前の質問なんてわからないから前の質問のリンクを付けるなりなんなりしないと。 実行環境が無いのとC++/CLIはあまり詳しくないので見た感じで。 A: 一致した結果が無いからでは? C#では文字列リテラルの前に@をつけると\を文字として認識しますが、C++ではそのままではエスケープ文字として認識するような気が。 \\にする必要があるのでは? 直列にResult()を呼ばないで、Successプロパティを確認してみては? http://msdn.microsoft.com/ja-jp/library/system.text.regularexpressions.group.success.aspx B: string->Empty じゃなくて、 String->Empty なのでは? http://msdn.microsoft.com/ja-jp/library/system.string.empty%28v=vs.110%29.aspx

stokyostokyo3
質問者

お礼

前略 ・再度、さっそくのアドバイス・ご教示をいただきありがとうございます。アドバイス・ご教示にしたがってコードを修正したところ、両方式ともC#と同じ実行結果を得ることができました。 >回答者はあなたの前の質問なんてわからないから前の質問のリンクを付けるなりなんなりしないと。 ・質問の構成が不明瞭で、またリンクを貼るアイデアが頭に浮かばず申し訳ありませんでした。今後、このような場合はリンクを活用したと思います。 //--------------------------------------- <摘出方法A>: >\\にする必要があるのでは? ・\ → \\ に変更したら、C#と同じ実行結果を得ることができました。以下に実行したソースコードを記載します。 Regex^ re = gcnew Regex("\\{(?<moji>[0-9A-Fa-fx\\r\\s,]+)\\}"); String^ st = re->Match(richTextBox1->Text)->Result("${moji}")->TrimStart()->TrimEnd(); MessageBox::Show(st); //----------------------------------------------------------------- <抽出方法B>: >string->Empty じゃなくて、String->Empty ・string->Empty → String::Empty に変更したら、コンパイルできて、C#と同じ結果を得ることができました。以下に実行したソースコードを記載します。 Regex^ r = gcnew Regex("0x[0-9a-fA-F][0-9a-fA-F],( |\r\n)", System::Text::RegularExpressions::RegexOptions::IgnoreCase); Match^ m = r->Match(richTextBox1->Text); richTextBox1->Text = String::Empty; while (m->Success) { richTextBox1->Text += m->Value; m = m->NextMatch(); } 以上、今後ともよろしくお願いします

その他の回答 (1)

回答No.1

16進数の並んだファイル hex.txt を作っておいて、 const char __GOLFontDefault[] = { #include "hex.txt" }; ってやっちゃダメですか?

stokyostokyo3
質問者

お礼

前略 ・さっそくのアドバイスありがとうございます。 >16進数の並んだファイル hex.txt を作っておいて......... ・マイコンのソースコードファイルの中から ”16進数の並んだファイル hex.txt”をプログラムで自動的につくるのがプログラムの目的です。  あるマイコンの漢字フォント作成に挑戦しています。その過程でソースコードからパソコンやマイコンのフォント構造体から イメージデータ部分だけを抽出しようとしているところです。 以上

関連するQ&A

  • C#: ソースコードから16進数のみ抽出

    前略 ・.NET 2012 のC#をつかっています。 下記のようなマイコンのソースコードから0xXX, 0xXX,...  で表記されているデータ部分 すなわち16進数とその区切りカンマだけを C#のプログラムで抽出したと思っています。いろいろやっているのですがうまくゆきません。 リッチテキストに抽出前のソースプログラムを表示して、ボタンをクリックしたら このリッチテキストに抽出された文字列(データ部分)だけを表示したいと思っています。どなたか具体的にコードサンプルで、ご教示いただければ幸いです。  尚、実際に作成したいデータは フォントの構造体からデータ部分のみを抽出したものです。 以上、よろしくお願いします。 例 //-------抽出前-------------- #include "Graphics.h" #ifdef USE_GOL #if(GRAPHICS != 0x0306) #warning "use Graphics Library version 3" #endif #if defined __XC32__ extern const char __GOLFontDefault[] ; const FONT_FLASH GOLFontDefault = { (FLASH | COMP_NONE), }; const char __GOLFontDefault[] = { 0x00, 0x00, 0x1C, 0x00, 0x7E, 0x00, 0x1B, 0x00, 0x10, 0x94, 0x01, 0x00, 0x10, 0xCA, 0x01, 0x00, 0x11, 0x00, 0x02, 0x00, 0x11, 0x51, 0x02, 0x00, 0x05, 0xA2, 0x02, 0x00, }; #endif //-------抽出後------------- 0x00, 0x00, 0x1C, 0x00, 0x7E, 0x00, 0x1B, 0x00, 0x10, 0x94, 0x01, 0x00, 0x10, 0xCA, 0x01, 0x00, 0x11, 0x00, 0x02, 0x00, 0x11, 0x51, 0x02, 0x00, 0x05, 0xA2, 0x02, 0x00,

  • 値の抽出

    Excelでマクロを使って値の抽出をしたいのですが、自分ではうまくいきません。どうかお力をお貸し下さい。 A1セル:品番 A2セル:DDH0020 A3セル:DDH0030 A4セル:DDH0040 A5セル:DDH0050 … A30セル:DDH0150 B1セル:品名 B2セル:ゴウハン 13*20.0X 56X807 U B3セル:ゴウハン 13 20.0X 56X845 U B4セル:ゴウハン 13 20.0X 85X1257 U B5セル:ゴウハン 13 20.0X 56X1280 U … B30セル:ゴウハン 13*20.0X 232X1897 U このような形で30行目まであります。 この内のB列の数字部分(2行目であれば)、20と56と807を抜き出し C2セル:20,D2セル:56,E2セル:807 (3行目であれば) C3セル:20,D3セル:56,E3セル:845 (4行目であれば) C4セル:20,D4セル:85,E4セル:1257 と表示させたいのです。 ご面倒おかけしますが、どうかご回答をお願いします。

  • 数学(ベクトル)の問題

    http://okwave.jp/qa/q8022847.html のNO.7の回答より、 さらに途中式を書いたのですが、 L^2 = m(t-n(s))^2-(a1^2+b1^2+c1^2 ) {(c1(z2-z1)+b1(y2-y1)+a1(x2-x1)+(a1a2+b1b2+c1c2)s)/(a1^2+b1^2+c1^2 )}^2+(a2^2+b2^2+c2^2 ){(s^2 )+2s{c2(z2-z1)+b2(y2-y1)+a2(x2-x1)}/{(a2^2+b2^2+c2^2 )} }+{(x2-x1)^2 }+{(y2-y1)^2 }+{(z2-z1)^2 } n(s)={c1(z2-z1)+b1(y2-y1)+a1(x2-x1)+(a1a2+b1b2+c1c2)s}/(a1^2+b1^2+c1^2 ) = m(t-n(s))^2-{c1(z2-z1)+b1(y2-y1)+a1(x2-x1)+(a1a2+b1b2+c1c2)s}^2/(a1^2+b1^2+c1^2 )+(a2^2+b2^2+c2^2 ){(s^2 )+2s{c2(z2-z1)+b2(y2-y1)+a2(x2-x1)}/{(a2^2+b2^2+c2^2 )} }+{(x2-x1)^2 }+{(y2-y1)^2 }+{(z2-z1)^2 } = m(t-n(s))^2-{c1(z2-z1)+b1(y2-y1)+a1(x2-x1)+(a1a2+b1b2+c1c2)s}^2/(a1^2+b1^2+c1^2 )+(a2^2+b2^2+c2^2 )(s^2 )+2s{c2(z2-z1)+b2(y2-y1)+a2(x2-x1)}+{(x2-x1)^2 }+{(y2-y1)^2 }+{(z2-z1)^2 } ところで {c1(z2-z1)+b1(y2-y1)+a1(x2-x1)+(a1a2+b1b2+c1c2)s}^2 = {c1(z2-z1)+b1(y2-y1)+a1(x2-x1)}^2 +2{c1(z2-z1)+b1(y2-y1)+a1(x2-x1)}(a1a2+b1b2+c1c2)s +{(a1a2+b1b2+c1c2)s}^2 = {c1(z2-z1)+b1(y2-y1)+a1(x2-x1)}^2 +2{c1(z2-z1)+b1(y2-y1)+a1(x2-x1)}(a1a2+b1b2+c1c2)s +(a1a2+b1b2+c1c2)^2 (*s)^2 これより、 L^2= m(t-n(s))^2+s^2 {(a2^2+b2^2+c2^2 )-(a1a2+b1b2+c1c2)^2/(a1^2+b1^2+c1^2 )} +s[2{(c2(z2-z1)+b2(y2-y1)+a2(x2-x1))-{c1(z2-z1)+b1(y2-y1)+a1(x2-x1)}(a1a2+b1b2+c1c2)s/(a1^2+b1^2+c1^2 )}] +{(x2-x1)^2 }+{(y2-y1)^2 }+{(z2-z1)^2 }-{c1(z2-z1)+b1(y2-y1)+a1(x2-x1)}^2/(a1^2+b1^2+c1^2 ) 簡単、 L^2 =m(t-n(s))^2+ps^2+p1s+p2 =m(t-n(s))^2+p(s^2+p1s/p)+p2 =m(t-n(s))^2+p(s^2+p1s/p+(p1/p)^2-(p1/p)^2 )+p2 =m(t-n(s))^2+p(s^2+p1s/p+(p1/p)^2 )-(p1)^2/p+p2 まで、計算したのですが(間違っていたら申し訳ありません)、 ここから、どのように q=-p1/2p が導出できるのかがわからないです。 (rは導出できました。) 数式だらけで分かりづらいと思いますが、計算ミスを指摘しつつ、導出過程も分かりやすくお願いします。

  • ”カラー表示プログラム”のソースコードは何を実現するものなの

    以下のプログラムは ”カラー表示プログラム”であるとかいてありましたので、これを記述して color。cpp  の名前で保存してコンパイルしてから #include <stdio.h> main() { printf("\x1b[4;36mColor Sample\x1b[4;m\n"); printf("\x1b[31mRed\n"); printf("\x1b[32mGreen\n"); printf("\x1b[33mYerrow\n"); printf("\x1b[34mBlue\n"); printf("\x1b[35mMagenta\n"); printf("\x1b[36mCyan\n"); printf("\x1b[37mWhite\n"); } 以下の  color.exe  をDOSで実行しましたら次のようになりました。 "\My Documents\C\color.exe" Color Sample Red Green Yerrow Blue Magenta Cyan White てっきり、カラー表示の帯のようなものができると、思っていましたが、色番の数字と m が再現されただけでした。  一体 これは 私の思い違いなのでしょうか? そもそもこの”カラー表示プログラム”のソースコードは何を実現するものなのでしょうか?  c言語はまだ始めたばかりで、つまずいてしまいました。「ひまわり」という日本語で記述できる簡単なプログラム などを参照しながら、同じようなことがないのかみてみましたが、文字色の変更、とか 色の番号を出すとかありますが、上のようなものは見当たりません。  つまずくと、先に進むのが、億劫になります。この基礎的な(たぶん)ことを教えていただければ ありがたいのですが。ちなみにこのことが書いてあるのは、『はじめてのc言語」  秀和システム 佐々木 整 1995・9 の本です。 このテキスト画面では、 ”color.exe" の実行画面の各行の先頭がおかしく表現されますが、正しくは、 ┛の左先に矢印←が付いたものです。

  • ソースコードを簡潔に直したいのですが…

    有限積分法(参考 http://www.akita-nct.jp/yamamoto/study/thesis/2005/thesis_namekawa.pdf) を用いて、格子点 ( i, j, k )の磁場成分 Bx, By, Bz をその周辺を囲む電場成分 Ex, Ey, Ez で逐次計算するコードは次のようになります。 for ( i = 0; i < i_max; i++ ) {   for ( j = 0; j < j_max; j++ ) {     for ( k = 0; k < k_max; k++ ) {       Bx [ i ][ j ][ k ] = Ey [ i + 1 ][ j ][ k ] - Ey [ i + 1 ][ j ][ k + 1 ] + Ez [ i + 1 ][ j + 1 ][ k ] - Ez [ i + 1 ][ j ][ k ];       By [ i ][ j ][ k ] = Ez [ i ][ j + 1 ][ k ] - Ez [ i + 1 ][ j + 1 ][ k ] + Ex [ i ][ j + 1 ][ k + 1 ] - Ex [ i ][ j + 1 ][ k ];       Bz [ i ][ j ][ k ] = Ex [ i ][ j ][ k + 1 ] - Ex [ i ][ j + 1 ][ k + 1 ] + Ey [ i + 1 ][ j ][ k + 1 ] - Ey [ i ][ j ][ k + 1 ];     }   } } 電場成分の係数行列 C ( 0, 1, -1 のいずれかをもつ ) を求める必要が生じた、すなわち CCC  E  B CCC * E = B CCC  E  B のような行列計算に変更するため、次のように書き直しましたが係数行列 C を求める部分を簡潔にできませんでした。 for ( i = 0; i < i_max; i++ ) {   for ( j = 0; j < j_max; j++ ) {     for ( k = 0; k < k_max; k++ ) {       for ( x = 0; x < 3; x++ ) {         row = index ( x, i, j, k, i_max, j_max, k_max );         y = ( x + 1 ) % 3;         z = ( x + 2 ) % 3;         if ( x == 0 ) {           C[ row ][ index ( y, i + 1, j,   k,   i_max, j_max, k_max )] = 1;           C[ row ][ index ( y, i + 1, j,   k + 1, i_max, j_max, k_max )] = -1;           C[ row ][ index ( z, i + 1, j + 1, k,   i_max, j_max, k_max )] = 1;           C[ row ][ index ( z, i + 1, j,   k,   i_max, j_max, k_max )] = -1;         }         if ( x == 1 ) {           C[ row ][ index ( y, i,   j + 1, k,   i_max, j_max, k_max )] = 1;           C[ row ][ index ( y, i + 1, j + 1, k,   i_max, j_max, k_max )] = -1;           C[ row ][ index ( z, i,   j + 1, k + 1, i_max, j_max, k_max )] = 1;           C[ row ][ index ( z, i,   j + 1, k,   i_max, j_max, k_max )] = -1;         }         if ( x == 2 ) {           C[ row ][ index ( y, i,   j,   k + 1, i_max, j_max, k_max )] = 1;           C[ row ][ index ( y, i,   j + 1, k + 1, i_max, j_max, k_max )] = -1;           C[ row ][ index ( z, i + 1, j,   k + 1, i_max, j_max, k_max )] = 1;           C[ row ][ index ( z, i,   j,   k + 1, i_max, j_max, k_max )] = -1;         }       }     }   } } int index ( const int d, const int i, const int j, const int k, const int i_max, const int j_max, const int k_max ) {   return ( ( d * i_max + i ) * j_max + j ) * k_max + k; } void Solver ( const int i_max, const int j_max, const int k_max) {   int row, col,     cell_num = i_max * j_max * k_max;   for ( row = 0; row < cell_num; row++ ) {     for ( col = 0; col < cell_num; col++ ) {       B [ row ] += C [ row ][ col ] * E [ col ];     }   } } 添え字計算が多く、非常に複雑なソースコードですが、規則性があるので、 皆様の力をお借りして簡潔に表現したいです。 よろしくお願いします。

  • この方程式のスマートな解法を教えてください.

    この方程式のスマートな解法を教えてください. (a-x)(1-x)^2 - (b^2 + c^2)(1-x) = 0 (a,b,c:const)

  • EXCELのデータ抽出

    縦x横x奥行の寸法データが記載されたデータが取引先からEXCELで届きます。 1300x500x10 や 500x500x100という表記です。 これらの寸法データはワンオフ品のため毎回4桁~2桁の数値で異なります。 縦、横、奥行のデータを下記のようにそれぞれ別のセルに抽出したいと思い いろいろ調べてみたのですがいい方法が見当たりません。 なにか方法はあるでしょうか? ご教示お願いします。 A列 1300x500x10  A列   B列   C列 1300   500   10

  • 連立方程式

    以下の連立方程式の解法を御教授頂きたいです。 (a1*x1+a2*x2)^2+(a1*x3+a2*x4)^2=a3^2 (b1*x1+b2*x2)^2+(b1*x3+b2*x4)^2=b3^2 (c1*x1+c2*x2)^2+(c1*x3+c2*x4)^2=c3^2 (d1*x1+d2*x2)^2+(d1*x3+d2*x4)^2=d3^2 a1~b3、b1~b3、c1~c3、d1~d3は定数です。 地道に式を変換してx4、x3と代入してx4、x3を消していき、 x1、x2の連立方程式まで算出しましたが、式が複雑化し、 解けなくなりました。 未知数が4で、式が4つあるので解けるとは思いますが、 うまくいきません。 どうかアドバイスをお願い致します。

  • Excelで、データの抽出について質問します。

    Excelの同一セル内の数字のみの抽出について教えて 下さい。 セルA1:カベシタジゴウハン 9X 50X1800 D9 セルA2:ウケゴウハン T5.5 40X 300 U7 セルA3:ゴウハンK 2.5X 60X 80 スペーサー セルA4:ランバP *412X3547 W2 セルA5:VSF K 12.5X 47X 869 LE セルA6:VSF J*12X 68X2395 Wメン WX とシートに入っているとします。これを、 セルB1:9  セルC1:50  セルD1:1800 セルB2:5.5  セルC2:40  セルD2:300 セルB3:2.5  セルC3:60  セルD3:80 セルB4:空白 セルC4:412 セルD4:3547 セルB5:12.5 セルC5:47  セルD5:869 セルB6:12  セルC6:68  セルD6:2395 と入るように関数を使うにはどうしたら良いでしょうか。 マクロを使うことになっても構いませんので、教えて下さい。

  • データ抽出について教えて下さい。

    以前質問し、マクロを作って頂いたのですが、行と列を挿入しなくてはならなくなり、マクロが機能しなくなってしまいました。 ●以前の質問● セルA1:カベシタジゴウハン 9X 50X1800 D9 セルA2:ウケゴウハン T5.5 40X 300 U7 セルA3:ゴウハンK 2.5X 60X 80 スペーサー セルA4:ランバP *412X3547 W2 セルA5:VSF K 12.5X 47X 869 LE セルA6:VSF J*12X 68X2395 Wメン WX とシートに入っているとします。これを、 セルB1:9  セルC1:50  セルD1:1800 セルB2:5.5  セルC2:40  セルD2:300 セルB3:2.5  セルC3:60  セルD3:80 セルB4:空白 セルC4:412 セルD4:3547 セルB5:12.5 セルC5:47  セルD5:869 セルB6:12  セルC6:68  セルD6:2395 と入るように関数を使うにはどうしたら良いでしょうか。 マクロでも構いません。 ●採用させて頂いた回答● Sub test() Dim i, ii, iii Dim a As String For i = 1 To Range("a65536").End(xlUp).Row a = "" iii = 0 For ii = 1 To Len(Cells(i, 1).Value) If IsNumeric(Mid(Cells(i, 1).Value, ii, 1)) Or Mid(Cells(i, 1).Value, ii, 1) = "." Then a = a & Mid(Cells(i, 1).Value, ii, 1) ElseIf a <> "" Then Cells(i, 2).Offset(, iii).Value = a a = "" iii = iii + 1 End If If iii = 3 Then Exit For Next ii Next i End Sub ●今回セルが変わりました● セルB2:カベシタジゴウハン 9X 50X1800 D9 セルB3:ウケゴウハン T5.5 40X 300 U7 セルB4:ゴウハンK 2.5X 60X 80 スペーサー セルB5:VSF K 12.5X 47X 869 LE セルB6:VSF J*12X 68X2395 Wメン WX とシートに入っています。これを、 セルC2:9  セルD2:50  セルE2:1800 セルC3:5.5  セルD3:40  セルE3:300 セルC4:2.5  セルD4:60  セルE4:80 セルC5:12.5 セルD5:47  セルE5:869 セルC6:12  セルD6:68  セルE6:2395 このように入るようにしたいのです。 以前採用させて頂いたマクロを修正したいのですが、どうも自分では失敗してしまいます。 お力をお貸し頂ければ幸いです。

専門家に質問してみよう