- ベストアンサー
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進数に変換をして値を表示をしたいのです。 すみませんよろしくお願いします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
訂正。 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)
- chie65536(@chie65535)
- ベストアンサー率44% (8740/19838)
>char buff[12]; >buff[0] = 0xFD; >が代入されています。 >この値を >unsinged char buff_2[12]; >に代入したいんですが、何か方法はありますか? なんでそんなアホな事考えた?代入なんかイラネエだろよ。 参照する時に、つまり、取り出す時に ほげほげ = (unsigned char)buff[0]; とか printf("%d\n",(unsigned char)buff[0]); とか「符号無しだと思って取り出せ」ってやれば済むじゃんよ。 「はじめてのC」でも読んで出直しておいで。
- chie65536(@chie65535)
- ベストアンサー率44% (8740/19838)
printf("%d\n",((unsigned char)(buff_char[0]) << 16) + ((unsigned char)(buff_char[1]) << 8) + (unsigned char)(buff_char[2])); ってやってみな。
- kmee
- ベストアンサー率55% (1857/3366)
まず。 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になるような値は使えないということになりそうですが。
- Tacosan
- ベストアンサー率23% (3656/15482)
入っている値はこれ以外にありえないのでしょうか? これ以外にありえないのなら何も考えず「65000」と表示すれば終わり. これ以外の値もあり得るというなら, どう表示すればいいのかを明らかにしてください. 特に buff_char[3] 以降の値が表示に影響するのかしないのかが分かりません.
補足
御回答ありがとうございます。 すみません、重ね重ね質問なんですが、 char buff[12]; buff[0] = 0xFD; が代入されています。 この値を unsinged char buff_2[12]; に代入したいんですが、何か方法はありますか? よろしくお願いします。