• ベストアンサー

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進数に変換をして値を表示をしたいのです。 すみませんよろしくお願いします。

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

  • ベストアンサー
回答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)

回答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」でも読んで出直しておいで。

回答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