none
string^型に入れた数字文字列を2文字ごとにHEX数値として使用することはできますか? RRS feed

  • 質問

  • テキストボックスに入っている42文字の文字をHEX数値として、2文字ごとに数値データとして使用したいのですが、

     

    100000004466FFFFFFFFFFFFFFFFFFFFFFFFFFFF

     

    例えば、char b[21];という配列を用意して、テキストボックスに入った文字列をHEX数値として代入していく方法はありませんでしょうか?

    	private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
    
    
    
    			String^ a;
    			char b[21];
    
    
    			a = textBox1->Text;
    
    
    			for(i=0;i<21;i++)
    				b[i] = S2Hex(a[i]);
    
    
    
    
    			 }
    

    思いつきなんですが、こういうプログラムが書けないのかなと考えております。

    どうぞご教授の程よろしくお願い致します。

     

     

     

     

     

     

     

     

     

     

     

     

    2011年8月11日 5:39

回答

  •  

    > 基本、C++どころか、C言語も怪しいのですが、

    VC++でないといけないのでしょうか?

    どういう風に使われるのか分かりませんが、ここに書かれているいる程度でしたら、Excelの関数でもできませんか?

    テキストデータをExcelに貼り付けて、文字列関数と Hex2Dec()とかで、16進10進変換すれば、

    それなりに簡単にできませんか?

    大量のデータとか、桁数が多い数字をそのままは難しいと思いますが、(C/C++でも同様かと)

    内容次第ですが、検討してはどうでしょう。

    もっとも C/C++の練習なら、それもそれで良いとは思いますが、、、。

    • 回答の候補に設定 山本春海 2011年8月29日 8:57
    • 回答としてマーク 山本春海 2011年8月31日 6:06
    2011年8月11日 15:25
  • 基本、C++どころか、C言語も怪しいのですが、いろいろコード作成のことなど質問させて頂き生意気にも失礼致します。
    今やりたいこととしては、ATmega88というマイコンのEEPROMデータをPCに保存する際にテキストデータとしてインテルHEX形式で書かれているため、それぞれの行の数値を加算して、それを2の補数計算をした結果を表示しないと行けないということをやりたく、ちょうど開発環境がExpressでVC++でできるというのを聴き勉強させてもらっています。

    まず、GUIが必要ですか?
    GUI(ウインドウでの表示)が必要無いのであれば、コンソールアプリでも十分だと思います。
    コンソールアプリであれば、ウインドウ周りの制御を勉強しなくても動作させる事が出来るので
    ウインドウを使った表示が目的で無いのであれば、C++でコンソールアプリを使った方が良いのでは
    無いかと思います。Express EditionではGUIを使ったソフトはC++/CLIを使ってプログラムをする
    前提で開発環境が構築されているので厳密に言えば、C言語でもC++言語でもGUIアプリは
    組めるのですが、そのためには色々知識を必要としますからそれなりに勉強が必要になります。

    勉強をするにしても段階を踏まないと理解が難しくなります。
    効率よく勉強をするには段階を踏む事が必要だと思いますよ。


    解決した時は、参考になったレスポンスの所にある[回答としてマーク]ボタンをクリックしてスレッドを締めましょう。
    • 回答の候補に設定 山本春海 2011年8月29日 8:57
    • 回答の候補に設定 山本春海 2011年8月29日 8:57
    • 回答としてマーク 山本春海 2011年8月31日 6:06
    2011年8月17日 4:26

すべての返信

  • String^ aに格納された文字列をHEX数値としてchar b[21]に変換したい、という質問ですか? 問題箇所をきちんと切り分け簡単化するとテキストボックスが無関係になるのは理解できますか?

    次にString^型というのはいったん忘れて、

    • C言語(Cランタイムライブラリ)でなら書けますか?
    • C++言語(STL等)でなら書けますか?
    • C#言語(.NET Frameworkクラスライブラリ)でなら書けますか?

    何か少しでもできれば、そこから説明していくこともできますが…いきなり、C++/CLIを使用するのは敷居が高いと思います。

    それともtechhouse_styleさんに代わってプログラムを書いてくださいとか?

    2011年8月11日 6:09
  • 思いつきなんですが、こういうプログラムが書けないのかなと考えております。

    できるかどうかで言えば、できます。
    が、そのコードをそのまま書いてもコンパイルが通らないのは明白なので、自分で代わりのコードを組み立てる必要があります。

    すでにアドバイスがあるように、どこからならあなたは書けるのでしょうか?
    char source[] = "100000004466FFFFFFFFFFFFFFFFFFFFFFFFFFFF"; からなら、自分のやりたいことはできるのですか?

    C++/CLI は C++ がある程度使えることが前提の言語、開発環境といえます。
    C++ なり、C 言語なりでのやり方が思い浮かばないのであれば、いきなりコードを書こうとするのではなく、基礎的なところから学び直してください。


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    2011年8月11日 9:41
    モデレータ
  • 回答頂きありがとうございます。

     

    基本、C++どころか、C言語も怪しいのですが、いろいろコード作成のことなど質問させて頂き生意気にも失礼致します。

    今やりたいこととしては、ATmega88というマイコンのEEPROMデータをPCに保存する際にテキストデータとしてインテルHEX形式で書かれているため、それぞれの行の数値を加算して、それを2の補数計算をした結果を表示しないと行けないということをやりたく、ちょうど開発環境がExpressでVC++でできるというのを聴き勉強させてもらっています。

     

    ある程度自分でやりたいのですが、できればサポートして頂ければ幸いです。

    2011年8月11日 10:19
  • 回答頂きありがとうございます。

     

    基本、C++どころか、C言語も怪しいのですが、いろいろコード作成のことなど質問させて頂き生意気にも失礼致します。

    今やりたいこととしては、ATmega88というマイコンのEEPROMデータをPCに保存する際にテキストデータとしてインテルHEX形式で書かれているため、それぞれの行の数値を加算して、それを2の補数計算をした結果を表示しないと行けないということをやりたく、ちょうど開発環境がExpressでVC++でできるというのを聴き勉強させてもらっています。

     

    ある程度自分でやりたいのですが、できればサポートして頂ければ幸いです。

    2011年8月11日 10:20
  • 基本、C++どころか、C言語も怪しいのですが、

    多分、佐祐理さんや Azulean さんが仰ってることを理解していないと思うので口を出します。
    あなたが今扱っているのは、C でも C++ でもなく C++/CLI です。
    そしてあなたが今たずねているのは、開発言語学習者が独学で済ませる程度の内容です。
    2011年8月11日 10:36
  • ある程度自分でやりたいのですが、できればサポートして頂ければ幸いです。

    一度、入門書などを読み通して学んでみませんか?
    残念ながら、1から10まで教えられるほど私も時間が空いていませんので。。。

    # ソフトがほしいだけなら、知り合いにでも頼むとか、自分でわかる言語で作るとか。
    # ソフトを作る力を身につけたいなら、それなりの努力を求めます。


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    2011年8月11日 11:37
    モデレータ
  • TextBoxに入力された文字列と、それから導き出される期待した処理結果の例を具体的に上げることは可能でしょうか?
    また、言語以前にどういう処理をしたいのか、言葉で構いませんので具体的にアルゴリズムの説明をしてもらえると、回答しやすいと思います。
    その上で、Platform(C/C++/C++/CLI)に何を選ぶか決めましょう。

    単純に文字列を文字コードに変換すると言っても、文字コード種は様々です。
    textBox1->Textで取得できる文字列はUTF-16 LEになります。

    例えば、以下のようなCodeでTextBoxに"abcd"と入力した場合、

    String ^s = textBox1->Text;
    StringBuilder ^sb = gcnew StringBuilder();
    int count = s->Length / 2;
    
    for(int i = 0 ; i < count ; i ++)
    {
      UInt16 c1 = (UInt16)s[i * 2];
      UInt16 c2 = (UInt16)s[i * 2 + 1];
    sb->AppendFormat("{0:X}{1:X}",c1,c2); } textBox2->Text = sb->ToString();

    結果は"61626364"となります。

     


    • 編集済み kozz 2011年8月11日 12:15 記述ミス
    2011年8月11日 12:08
  • 質問文を誤解されていると思います。

    Regex.Match(a,"(..)+").Groups[1].Captures.Cast<Capture>().Select(c => Byte.Parse(c.Value, NumberStyles.AllowHexSpecifier))

    的な何かです。ついでに言うとUTF-16 LEのLEもちょっと蛇足気味です…。

    2011年8月11日 12:54
  • 質問文を誤解されていると思います。

    Regex.Match(a,"(..)+").Groups[1].Captures.Cast<Capture>().Select(c => Byte.Parse(c.Value, NumberStyles.AllowHexSpecifier))

    的な何かです。ついでに言うとUTF-16 LEのLEもちょっと蛇足気味です…。

    質問の内容については、よく理解できなかったため最初に確認する文章を記述しています。
    Sample Codeは単純に文字コードの例を示しています。

    あと蛇足というのは、何故ですか?

    2011年8月11日 13:32
  • 質問文やkozzさんの挙げられたコードは、バイト型やポインターを扱っているわけではないので、メモリーレイアウトまで言及されてません。
    この範囲であれば、.NET Frameworkとしては中立の立場で、リトルエンディアンには限定されないと思います。
    2011年8月11日 15:11
  •  

    > 基本、C++どころか、C言語も怪しいのですが、

    VC++でないといけないのでしょうか?

    どういう風に使われるのか分かりませんが、ここに書かれているいる程度でしたら、Excelの関数でもできませんか?

    テキストデータをExcelに貼り付けて、文字列関数と Hex2Dec()とかで、16進10進変換すれば、

    それなりに簡単にできませんか?

    大量のデータとか、桁数が多い数字をそのままは難しいと思いますが、(C/C++でも同様かと)

    内容次第ですが、検討してはどうでしょう。

    もっとも C/C++の練習なら、それもそれで良いとは思いますが、、、。

    • 回答の候補に設定 山本春海 2011年8月29日 8:57
    • 回答としてマーク 山本春海 2011年8月31日 6:06
    2011年8月11日 15:25
  • 質問文やkozzさんの挙げられたコードは、バイト型やポインターを扱っているわけではないので、メモリーレイアウトまで言及されてません。
    この範囲であれば、.NET Frameworkとしては中立の立場で、リトルエンディアンには限定されないと思います。

    この範囲もなにも要件が不明瞭ですので、推測の範囲で記述をしています。
    言及されていない点は、要件が明らかになる中で、言及される可能性が皆無ということでしょうか。

    2011年8月12日 5:10
  • この範囲もなにも要件が不明瞭ですので、推測の範囲で記述をしています。
    言及されていない点は、要件が明らかになる中で、言及される可能性が皆無ということでしょうか。

    推測の範囲ではリトルエンディアンと断言できないから蛇足と表現しました。もし推測の範囲でリトルエンディアンと断言できる根拠がおありでしたら挙げてください。

    2011年8月12日 8:37
  • 推測の範囲ではリトルエンディアンと断言できないから蛇足と表現しました。もし推測の範囲でリトルエンディアンと断言できる根拠がおありでしたら挙げてください。

    お互いの推測の範囲(視点)が異なるだけでしょう。
    根拠は、客観的に妥当であると検証できる手段や明確な尺度が存在しない限り、提示するものではありません。

    不明瞭な中で根拠だと考えられる内容を記述すれば、話が発散したり飛躍する可能性が高く、
    根拠の提示は適切でなはいと考えています。

    2011年8月14日 4:49
  • そもそもこの質問に全く関係のない文字コードの話題を持ち出す時点で、話を発散させている張本人だという自覚はありますか?
    さらに根拠もなくリトルエンディアンを持ち出していますし。 

    2011年8月14日 4:59
  • 基本、C++どころか、C言語も怪しいのですが、いろいろコード作成のことなど質問させて頂き生意気にも失礼致します。
    今やりたいこととしては、ATmega88というマイコンのEEPROMデータをPCに保存する際にテキストデータとしてインテルHEX形式で書かれているため、それぞれの行の数値を加算して、それを2の補数計算をした結果を表示しないと行けないということをやりたく、ちょうど開発環境がExpressでVC++でできるというのを聴き勉強させてもらっています。

    まず、GUIが必要ですか?
    GUI(ウインドウでの表示)が必要無いのであれば、コンソールアプリでも十分だと思います。
    コンソールアプリであれば、ウインドウ周りの制御を勉強しなくても動作させる事が出来るので
    ウインドウを使った表示が目的で無いのであれば、C++でコンソールアプリを使った方が良いのでは
    無いかと思います。Express EditionではGUIを使ったソフトはC++/CLIを使ってプログラムをする
    前提で開発環境が構築されているので厳密に言えば、C言語でもC++言語でもGUIアプリは
    組めるのですが、そのためには色々知識を必要としますからそれなりに勉強が必要になります。

    勉強をするにしても段階を踏まないと理解が難しくなります。
    効率よく勉強をするには段階を踏む事が必要だと思いますよ。


    解決した時は、参考になったレスポンスの所にある[回答としてマーク]ボタンをクリックしてスレッドを締めましょう。
    • 回答の候補に設定 山本春海 2011年8月29日 8:57
    • 回答の候補に設定 山本春海 2011年8月29日 8:57
    • 回答としてマーク 山本春海 2011年8月31日 6:06
    2011年8月17日 4:26