• ベストアンサー

VC++2010 MFC 16進数を10進数に変換

VC++2010 MFCでアプリケーションを作成しています。   16進数を10進数に変換することについて質問なんですが、 例: char buff_char[128]; buff_char[0] = 0xFD; buff_char[1] = 0xE8; buff_char[2] = 0x00; 上記の通り16進数が入っており それを メッセージボックスで 65000と10進数に変換をして値を表示をしたいのです。 すみませんよろしくお願いします。

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

  • ベストアンサー
  • chie65535
  • ベストアンサー率43% (8524/19374)
回答No.4

訂正。 printf("%d\n",((unsigned char)(buff_char[0]) << 16) + ((unsigned char)(buff_char[1]) << 8) + (unsigned char)(buff_char[2])); じゃなくて printf("%d\n",((unsigned char)(buff_char[0]) << 8) + (unsigned char)(buff_char[1])); だな。 じゃないと buff_char[0] = 0xFD; buff_char[1] = 0xE8; buff_char[2] = 0x00; を「65000」にする事はできね~わ。 数値的には 0xFD*256+0xE8=253*256+232=64768+232=65000 だから buff_char[0]が上位ワード buff_char[1]が下位ワード の2バイトデータと捉えるしかないよな。 3バイトなら、上位、中位、下位の順か、下位、中位、上位の順かどっちかなんだけど printf("%d\n",((unsigned char)(buff_char[0]) << 16) + ((unsigned char)(buff_char[1]) << 8) + (unsigned char)(buff_char[2])); でも printf("%d\n",((unsigned char)(buff_char[2]) << 16) + ((unsigned char)(buff_char[1]) << 8) + (unsigned char)(buff_char[0])); でも、どっちでやっても65000にはならね~。 だとすると「質問者さんがデータの並びを書き間違った」としか思えないから「0と1だけ使って2は無視する」しか無いよな。 なので「65000を表示する」としたら、buff_char[2]の事は無視して printf("%d\n",((unsigned char)(buff_char[0]) << 8) + (unsigned char)(buff_char[1])); と書くしかない。

その他の回答 (4)

  • chie65535
  • ベストアンサー率43% (8524/19374)
回答No.5

>char buff[12]; >buff[0] = 0xFD; >が代入されています。 >この値を >unsinged char buff_2[12]; >に代入したいんですが、何か方法はありますか? なんでそんなアホな事考えた?代入なんかイラネエだろよ。 参照する時に、つまり、取り出す時に ほげほげ = (unsigned char)buff[0]; とか printf("%d\n",(unsigned char)buff[0]); とか「符号無しだと思って取り出せ」ってやれば済むじゃんよ。 「はじめてのC」でも読んで出直しておいで。

  • chie65535
  • ベストアンサー率43% (8524/19374)
回答No.3

printf("%d\n",((unsigned char)(buff_char[0]) << 16) + ((unsigned char)(buff_char[1]) << 8) + (unsigned char)(buff_char[2])); ってやってみな。

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.2

まず。 buff_char[0] = 0xFD; これは buf_char[0] = 253 ; buf_char[0] = -3 ; /* VC++のcharは符号有りなので */ です。buf_charが「16進数で入っている」わけではありません。 unsigned char a,b ;として 上位8ビット a と下位8ビットb を組み合わせて16ビット整数にするには a << 8 | b /* 8ビット上へシフトしてOR */ a * 256 + b /* 256倍して下位を足す */ 等があります。16進数の各桁がどんな値を意味するのか考えれば、もっと大きな桁も同様に計算できます。 ただし、普通にintを使うと、ビット数が大きくなるとオーバーフローして期待する値になりません。 char buff_char[128]; とありますが、これ全部が1つの数値なら、128*8=1024ビットとなります。 また、例示されたものと、実際求めたい値との関係がよくわかりません。 buff_char[0] = 0xFD; buff_char[1] = 0xE8; buff_char[2] = 0x00; これが65000だとすると、buff_char[0] * 256 + buff_char[1] になります。 では、buff_char[2]はいったい何なのでしょうか? 関係無いのでしょうか?小数点以下の値なのでしょうか? 値の区切りなのでしょうか?区切りだとすると、8ビットが0になるような値は使えないということになりそうですが。

hanyu-yuugo
質問者

補足

御回答ありがとうございます。 すみません、重ね重ね質問なんですが、 char buff[12]; buff[0] = 0xFD; が代入されています。 この値を unsinged char buff_2[12]; に代入したいんですが、何か方法はありますか? よろしくお願いします。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

入っている値はこれ以外にありえないのでしょうか? これ以外にありえないのなら何も考えず「65000」と表示すれば終わり. これ以外の値もあり得るというなら, どう表示すればいいのかを明らかにしてください. 特に buff_char[3] 以降の値が表示に影響するのかしないのかが分かりません.

関連するQ&A

  • VC++2010 MFC 符号付きchar型変換

    VC++2010 MFCで今アプリケーションを作成していて、質問がございます。 例 char c_buff; unsigned char uc_buff; 上記のように変数を宣言し、 c_buffには0xFD;が入ってます。 その値を uc_buffに代入したいのですがどのように行ったら代入できるか よろしくお願いします。

  • 16進数を10進数文字列に変換する

    こんにちは。 お世話になります。 16進数を10進数文字列に変換する処理を作りたいのですが 方法が分かりません。 提供されている関数は使わずに変換する方法を知っている方がいたら教えていただきたいです。 以下は10進数を16進数に変換する関数を作ったものです。 void SetBinHex(BYTE Bin,BYTE *buff) { /*16進の変換*/ *(buff)=Bin/16; *(buff+1)=Bin%16; if(*(buff)>9) *(buff)=*(buff)+0x37; else *(buff)=*(buff)+0x30; if(*(buff+1)>9) *(buff+1)=*(buff+1)+0x37; else *(buff+1)=*(buff+1)+0x30; return ; } よろしくお願いします。

  • MFCでの進数変換

    MFCでの進数変換 始めまして、いまMicrosoftVisualStudio2010でMFCの勉強をしています ここで質問なのですが、ボタンを押されるとエディットボックスにAを表示するんですが このAを10進数の10に変換して表示できないでしょうか? MFCの使える関数でやりたいのですがどなたかご教授お願いします。

  • 16進数から10進数に変換

    いつもお世話になります。 先日バイナリデータを読み込み、ある特定のデータを検索し、 そのデータを10進数に変換する処理がしたいです。 FILE *fp; char buf[1024]; fp = fopen("sample.jpg","rb"); fread(buf, siZeof(char), 1024, fp); for( int i=0; i<1024; i++ ){ if( (buf[i]==0xff) && (buf[i+1] == 0xe0) ){ //※質問詳細下記します。 } } ※ f文で、buf[i+2]buf[i+3]、例えばprintf("%02x,%02x",buf[i+2],buf[i+3]); で出力すると、所望の(11 00 )の16進数で得られています。 このbuf[i+2] buf[i+3]の値を10進数に変換して得るには、 どうしたらいいでしょうか? 0x1100→4352 どうぞよろしくお願い致します。

  • VC++2010 MFC エディットボックスの質問

    VC++2010 MFC エディットボックスの質問なんですが、 バリュー型変数を使わないでどうやったら配列(char型8byte(unsigned char[8]))の中身すべてをエディットボックスにいれて表示することができますか?よろしくお願いします。配列の中身は文字もあったりします

  • VC++ 基礎

    VBAの低レベル(便利)な言語に慣れすぎて、VC++を始めましたが型変換が難しいです。 メッセージボックスに値を出すだけで一苦労です。 型変換を学べるサイトはないですか? または型変換の便利なクラスはないですか?

  • 日本語の変換の問題

    char * buff = "あいうえお"; があります。それを16進数に変換したいですが、 どうすれば、よろしいですか? よろしくお願いします。

  • VC++(MFC) とVC++,NETの違いと今度の需要

    VC++(MFC) とVC++.NET の違いと今後の需要についてです。 IT関係のものではないですが、パソコンが好きで 独学でプログラムの勉強をしようと考えています。 C言語は大学のカリキュラムで習った程度で、 Javaの文法的な独学の経験は多少あるという程度の者です。 まず、質問なんですが 「Visual Studio .NET 2005」を使用してできるのは、VC++(MFC)ではなく、VC++.NETの方ですよね? 「Visual Studio2008 Express Edition」もVC++.NETですかね? 従来のVC++(MFC)をやるにはどうすれば?まだ売っているんですか? (企業の求人にVC++(MFC)と限定して書いてあったので) また、無償のExpress Editionだとこれ以上の機能のフリーソフトは 作れないよ~みたいな制限なんかあれば教えてください。 メインの質問に戻りますが、 同じVC++でも MFCと.NET Freamework(,NET言語)じゃ ネイティブコードを吐き出さない(.NET)とは、処理速度が 違うんじゃないのかなぁーと思いまして。(よく理解してませんがw) それで、今後自分で勉強していくにあたって、どちらをすべきで 需要があるかなど迷っているんです。 それと合わせて、SQLデータベースを勉強するに当たってですが、 個人で勉強するには、何がいいかなと思いまして。 なんかオラクルなんて個人レベルじゃとっつきにくいんです。 MS-AccessかMySQL(Linux)でやってみようかと思うんですが スキルアップ(実用的ですかね)になりますかね? 現在Cent OS 4でMySQLが動くようにはしています。 また、何を作るかによって違ってくるとは思いますが、 何言語でwindowsアプリケーションを作り、そのアプリケーションから データベースに接続し、データを取得、表示、更新するようなものが一般的と思いますが、言語とデータベースの開発環境の組み合わせの 選択が、企業などの開発業務に携わったことがないので、 わかんないんです。 言語はこれで、データベースはこれ、で「******が出来るアプリケーション」を作ってみては?みたいな進めやすい例はないものでしょうか? いろいろ調べてるんですが、初心者向けに文法的なことは書いていますが、アプリケーションを実際に作りながら進めていく、VC++.NET(クライアント側windowsアプリケーション(画面))とAccess(サーバ側)を使用した、「個人用データ管理システム」みたいなのが見あたらないんです。 言語文法ばかり勉強しても、個人(自宅レベル)では 具体的な作品を作らないと実感が沸いてこないので。。。 いろんな情報教えていただけませんか? 調べる努力はしていますが、前に進まず、悔しいです(>.<) お願いします!

  • VC++2010 エディットボックスに値を表示

    現在、VC++2010 MFCでアプリケーションを作成しています。 そこで質問なんですが、 エディットボックスに値(今回はADボードからサンプリングした電圧値)をSetWindowTextや、UpdateData(FALSE);をつかってエディット表示などをしたんですが、これを毎秒表示しようとすると(SetTimer()で毎秒、ADボードで電圧値をサンプリングしエディットボックスに表示)7分後くらいにパソコンがフリーズしてしまいます。どのようにしたらフリーズされないか よろしくお願いします。

  • MFC Timerについて

    MFCのTimerの利用方法をいろいろ調べたのですが。 理解できずに困っています。 MFCのダイアログベースで作成し、ボタンを押したら Timer(1秒ごと)でエディットボックスに表示させるというものです。 ・ベースのウィンドウにボタンとエディットボックスを作成しました。 ・次に ボタンをダブルクリックし以下のように書きました。 void CtestDlg::OnBnClickedButton() {     int x=0; char buf[10000]; x++; sprintf(buf,"%d",x); (labelの変数名)_edit.SetWindowText(buf); } ・SetTimer(1, 1000, NULL);を用いて ボタンがクリックされたら1秒ごとにxの値をエディットボックスに表示させるようにしたいのですが。 OnTimer(UINT nIDEvent) Close()やKillTimer(1);をもちいらなければならないことはわかったのですが。 作業手順がわかりません。 詳しい 作業手順をおしえてください。 プログラム完成まで 教えていただけるととてもうれしいです。 プログラマーの方よろしくお願いします。

専門家に質問してみよう