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

このQ&Aのポイント
  • C#でソースコードから16進数のみを抽出する方法を教えてください
  • マイコンのソースコードから0xXXで表記されている16進数を抽出したいです
  • リッチテキストに抽出された16進数のみを表示する方法を知りたいです
回答を見る
  • ベストアンサー

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,

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

  • ベストアンサー
  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.2

提示されている物だけで言うなら、 using System.Text.RegularExpressions;//追加 Regex re = new Regex(@"\{(?<moji>[0-9A-Fa-fx\r\s,]+)\}"); string st = re.Match(richTextBox1.Text).Result("${moji}").TrimStart().TrimEnd(); MessageBox.Show(st); こんな感じでしょうか?

stokyostokyo3
質問者

お礼

前略 ・さっそくのご教示ありがとうございます。 コンパイルして実行して期待どうりの結果を確認できました。  正規表現に関しては、はじめて聞く言葉でした。 昨日一日 && と || で四苦八苦していました。 今後ともよろしくお願いします。 以上

その他の回答 (1)

  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.1

空行は無理かも知れませんが……正規表現で抜けませんかね? http://dobon.net/vb/dotnet/string/regexmatch.html  System.Text.RegularExpressions.Regex r = new System.Text.RegularExpressions.Regex("0x[0-9a-fA-F][0-9a-fA-F],( |\r\n)", System.Text.RegularExpressions.RegexOptions.IgnoreCase);  System.Text.RegularExpressions.Match m = r.Match(textBox1.Text);  textBox2.Text = string.Empty;  while (m.Success)  {   textBox2.Text += m.Value;   m = m.NextMatch();  } こんな感じでしょうか? 正規表現文字列を工夫すれば…"{"から"}"までの間を丸ごと抜き出すことも可能かと思われますが。 "0x[0-9a-fA-F][0-9a-fA-F],"または"\r\n"の1回以上の繰り返しがあって、"{"から始まって"}"で終わるまでの間…みたいな感じでしょうかね。

stokyostokyo3
質問者

お礼

前略 ・さっそく ご教示ありがとうございます。 コンパイル・実行をおこない空行なくデータが抽出できることを確認しました。   今後ともよろしくお願いします。 以上

関連するQ&A

  • 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,

  • 最後からn番目のデータを抽出する方法。

    データフィールド数が固定していないデータの最後から、3番目を抽出する方法は。 a1 aaa 111 x11 zzz 001 a2 bbb 222 001 x22 yyy 002 a3 ccc 333 x33 xxx 003 a4 ddd 444 001 002 x44 www 004 結果 x11 x22 x33 x44

  • C言語で他のファイルの値を参照する方法

    現在、組み込み系のソフト開発を行っています。 ファイルが、main.c と sub.c があります。 main.cで  #define kcode 0x01 と定義します。 その後、 sub.cでこのkcode の値を参照したいため、 #if kcode == 0x01 #endif と書きましたがコンパイルエラーになりました。 仕方なく、main.cで const unsigned char kcode 0x01; と書いて、sub.cで extern unsigned char kcode; if(kcode == 0x01){ } と書きました。 これしか方法がないのでしょうか? よろしくお願いします。

  • C++の組込みマクロのassert()が使えない

    こんにちは。 CygwinでC++開発を行っているのですが、C++の関数型マクロであるassert()が使えなくて困っています。 main関数を含むソースファイルに、 #include assert.h を記述しておけば使えるはずなのですが、そのソースファイルから実行ファイルを、 g++コマンドでビルドしようとすると、以下のようなエラーが出ます。 ------------------------------------------------------------ $ g++ test03-STLの使用.cpp /cygdrive/c/Users/Kei/AppData/Local/Temp/cckwDP4e.o:test03-STLの使用.cpp:(.text+0x904): undefined reference to `___assert_func' collect2: ld はステータス 1 で終了しました ------------------------------------------------------------ test03-STLの使用.cpp のmain関数は、以下の通りです。 ------------------------------------------------------------ int main() { string s="ABC DEF\nGH\tIJ"; reverse(s.begin(), s.end() ); assert(s=="JI\tHG\nFED CBA"); cout<<s return 0; } ------------------------------------------------------------ ちなみに、実際にインクルードされる /usr/include/assert.h の内容は以下のようになっていました。 ------------------------------------------------------------ /* assert.h */ #ifdef __cplusplus extern "C" { #endif #include "_ansi.h" #undef assert #ifdef NDEBUG /* required by ANSI standard */ # define assert(__e) ((void)0) #else # define assert(__e) ((__e) ? (void)0 : __assert_func (__FILE__, __LINE__, \ __ASSERT_FUNC, #__e)) # ifndef __ASSERT_FUNC /* Use g++'s demangled names in C++. */ # if defined __cplusplus && defined __GNUC__ # define __ASSERT_FUNC __PRETTY_FUNCTION__ /* C99 requires the use of __func__. */ # elif __STDC_VERSION__ >= 199901L # define __ASSERT_FUNC __func__ /* Older versions of gcc don't have __func__ but can use __FUNCTION__. */ # elif __GNUC__ >= 2 # define __ASSERT_FUNC __FUNCTION__ /* failed to detect __func__ support. */ # else # define __ASSERT_FUNC ((char *) 0) # endif # endif /* !__ASSERT_FUNC */ #endif /* !NDEBUG */ void _EXFUN(__assert, (const char *, int, const char *) _ATTRIBUTE ((__noreturn__))); void _EXFUN(__assert_func, (const char *, int, const char *, const char *) _ATTRIBUTE ((__noreturn__))); #ifdef __cplusplus } #endif ------------------------------------------------------------ Borland C++ Compilerのbcc32コマンドでは、先ほどのソースファイルから実行ファイルをビルドすることができたので、何が問題なのかが分かりません。 以上の件について何かご存知の方がいらっしゃれば、是非教えて頂きたいと思います。 では、よろしくお願い致します。

  • C++の問題で・・

    C++の問題で・・ 参考書に「簡易的な文字列クラスStringを作成せよ。」という問題があり作りました。 いかにそのコードを示します。今回の質問の内容に関係ないとおもうところや、インクルードなどは省かせていただきます。 環境は Visual studio 2008です。OSはXPです。 class String{     int len; //文字列の長さ     char *s; //文字列の先頭文字へのポインタ public:     String(const char *);     int length()const{return len;} //長さを求める     operator const char * ()const{return s;}     bool operator==(String &a)const{return strcmp(this->s, a);}     char *operator+(String&)const; }; char * String::operator +(String &a)const {     char *memory = new char[this->len + a.len + 1];     memory[0] = '\0';     return strcat(strcat(memory, this->s), a); } String::String(const char *p): s(const_cast<char *>(p)), len(strlen(p)){} String::String(const String &x) {     s = x.s;     len = x.len; } inline std::ostream& operator<<(std::ostream &s, String &x) {     return s << static_cast<const char *>(x); } int main() {     String a("My name is Paul");     String b("My name is Paul");     String c("My name");     String d(" is Paul");     cout << "a = " << a << "\n";     cout << "b = " << b << "\n";     cout << "c = " << c << "\n";     cout << "d = " << d << "\n";     cout << "a == b " << (a == b) << "\n";     cout << "a == c " << (a == c) << "\n";     cout << "c + d = " << (c + d) << "\n"; }     このようなプログラムなのですが、上記の char * String::operator +(String &a)const {     char *memory = new char[this->len + a.len + 1];     memory[0] = '\0';     return strcat(strcat(memory, this->s), a); } ところで、 memory[0] = '\0'; を除くと文字列を出力した結果をみると、先頭にいらない言葉が入っています。 僕の場合は x9My name is Paul と表示されます。文字化け・・ではないのですが、ゴミのようなものが・・ どうしてこのようなことが起こるか、どこでゴミが入ってしまうのか教えてほしいです。 稚拙なプログラムで申し訳ないです。 もし、間違っている場所や、もっと簡単にかけるようなところがあれば、ご指摘いただくとありがたいです。 よろしくお願いします!

  • EXCELのデータ抽出

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

  • C++の関数テンプレートで分からないところがあります。

    C++の関数テンプレートで分からないところがあります。 C++の入門書を読んで勉強しているのですが、その演習問題(答えはついてないです)で、以下のような問題がありました。 ----------------------------------------------------- 配列の全要素の最小値を求める関数テンプレートを作成せよ。 teplate <class Type> Type minof(const Type x[], int n); という形で作ること。 なお、最も小さい文字列を求められるようにするために、const char *型に明示的に特殊化したものも合わせて作成すること。 ------------------------------------------------ という問題なのですが、これにたいして僕は以下のように答えました。ヘッダのインクルードなどは省きます。 template<class Type> Type minof(const Type x[], const int n) {     int min = 0;     for(int i = 1; i < n; i++)         if(x[min] < x[i])             min = i;     return x[min]; } template<> const char* minof<const char *>(const char x[][64], const int n) {     int min = 0;     for(int i = 1; i < n; i++)         if(strcmp(x[min], x[i]) < 0)             min = i;     return x[min]; } int main() {     const int n = 5;     int a[n];     char s[n][64];     for(int i = 0; i < n; i++){         cout << i + 1 << "番目---";         cin >> a[i];     }     cout << "文字列\n";     for(int i = 0; i < n; i++){         cout << i + 1 << "番目---";         cin >> s[i];     }     cout << "整数の最小値---" << minof(a, n) << "です\n";     cout << "文字列の最小値---" << minof<const char *>(s, n) << "です\n"; } これをコンパイルすると、エラーで 明示的な特殊化; 'const char *minof<const char*>(const char [][64],const int)' は関数テンプレートの特殊化ではありません と 'minof' : 1 番目の引数を 'char [5][64]' から 'const char *const []' に変換できません。 とでてしまいます。 色々探してみたのですが、解決できませんでした・・。 特に最初のほうのエラーがよくわかりません。ちゃんと特殊化してる気はするのですが・・。 間違っている箇所の正当を載せていただけるとわかりやすくて、ありがたいです。 よろしくお願いします!

  • オイラー法のCプログラムについて

    x1[i+1]=x1[i]+x2[i]*t x2[i+1]=x2[i]+(-2ab*x2[i]-a^2*x1[i]+a^2*c)*t 上式を次のようなプログラムで表したのですが、出力される値が全て0になってしまいます。 もし原因が分かる方が居られましたらよろしくお願いします。 #include <stdio.h> int main(void) { double x1i = 0.0,x2i = 0.0; /*x1[i] x2[i]*/ double xa,xb; /*x1[i+1] x2[i+1]*/ double a; double b; double t = 0.05; double c = 1.0; scanf("%f" ,&a); scanf("%f", &b); while(t < 20){ xa = x1i + x2i * t; xb = x2i + ((-2 * b * a * x2i) - (a * a * x1i) + a * a * c) * t; x1i = xa; x2i = xb; t += 0.05; printf("%lf %lf \n", x1i,t); } return 0; }

  • C言語についてなのですが・・・

    さきほども上げたのですがカテゴリが間違っていたのでもう一回書き込みました まだプログラムの勉強をはじめた初心者なのですが、 テキストファイルから文字を読みこみ、大文字ならば小文字に変換し辞書順に並びかえるプログラムを作っているのですがどうしてもうまくいきません。 例えばtest.txtに XXX YYY YY XX BBB aaa aa BB とあれば aa aaa bb bbb xx xxx yy yyy と表示されるよにしたいんです。 自分が作ったプログラむはこれです。 まだテキストファイルからでなくキーボードからの入力になっていますが・・・ #include<stdio.h> #include<stdlib.h> #include<string.h> #include <ctype.h> int soto( const void *x, const void *y); int main(int argc, char *argv[]){ FILE *input; char str1[1000]; int i, j; for (i = 1; i < argc; i++){ qsort(argv[i], 1000, sizeof( char *), soto); strcpy(str1, argv[i]); for(j = 0; j < 100; j++){ str1[j] = tolower( str1[j] ); } printf("%s\n", str1); } return 0; } int soto( const void *a, const void *b){ char *x, *y; x = (char*)a; y = (char*)b; return x-y; } これだと小文字にはなるんですがソートされずに表示されてしまいます・・・ どのようにすればいけるのかご指摘のほどおねがいします

  • CからC#へ

    C#2008を使っています。 以下の昔のソースをC#に置き換える場合、引数のconst部分などでエラーが表示されます。 どのようにすればよいのでしょうか? int check(const char* s) { char msg[256]; // 正しいサイズか short siz = strlen(s); if(64 != siz){ sprintf(msg, "sが64バイトではありません。siz=[%d] s=[%s]\n", siz, s); printf("%s", msg); return 0; } // 正常 return !0; }

専門家に質問してみよう