ページ 11

16進のWORDデータを10進に変換する方法

Posted: 2008年5月09日(金) 01:59
by overdo
はじめまして。overdoといいます。
最近、こちらでDXライブラリの存在を知り、全く初めてゲームを作り始めた次第ですが、早くも分からないことがあり調べてみましたが結局分からず、すみませんが、こちらで質問させてください。

環境:VC++2003

バイナリデータにて、[59 01](リトルエンディアン)の2バイトデータがあった場合にこれを10進変換しますと345ですが、これをどうやって変換すればいいのか分かりません。

DXライブラリにファイル入力関数があったので以下のように使ってみました。

int hdl_file;
int intBig;
int intLittle;
hdl_file = FileRead_open("binarydata.txt"); //ファイルオープン
intBig = FileRead_getc(hdl_file); //59(16進)がとれます
intLittle = FileRead_getc(hdl_file); //01(16進)がとれます

//ココで5901 -> 345に変換する処理を行いたい

FileRead_close(hdl_file); //ファイルクローズ
※open~close内は実際はループ

二つの変数に分けた時点で間違いな気もするのですが、この二つを使って変換する関数があるのかが分かりません。
2バイトずつ取得する方法も分からなかったので5901(0159h)を取得して345に変換する関数でも構わないのですが・・。
他言語出身ですので、説明の仕方自体おかしいかもしれませんが、何卒、ご教授頂ければと思います。
宜しくお願いします。

Re:16進のWORDデータを10進に変換する方法

Posted: 2008年5月09日(金) 06:22
by tk-xleader
シフト演算を利用すれば問題ないと思います。

int Value;



Value=intBig|(intLittle<<8);

<余談>
Dxライブラリ使用ということで、細かいC++の言語仕様については無視ということで…

Re:16進のWORDデータを10進に変換する方法

Posted: 2008年5月09日(金) 07:33
by toyo
Visual C++ならMAKEWORDというマクロが定義されていると思います(WinDef.h)

#define MAKEWORD(a, b) ((WORD)(((BYTE)(((DWORD_PTR)(a)) & 0xff)) | ((WORD)((BYTE)(((DWORD_PTR)(b)) & 0xff))) << 8))

Value = MAKEWORD(intLittle, intBig);

/* intLittleとintBigが私の感覚では逆です */

Re:16進のWORDデータを10進に変換する方法

Posted: 2008年5月09日(金) 07:35
by toyo
間違えた
intBig = FileRead_getc(hdl_file); //59(16進)がとれます
intLittle = FileRead_getc(hdl_file); //01(16進)がとれます
の場合は
Value = MAKEWORD(intBig, intLittle);
になりますね。

Re:16進のWORDデータを10進に変換する方法

Posted: 2008年5月09日(金) 23:34
by overdo
ありがとうございます。シフト後のOR演算ということですね。
このような解決へのアプローチは慣れなのでしょうね・・。
この式に感動しました(笑)。

> /* intLittleとintBigが私の感覚では逆です */

ごもっともです。変数名を改めました・・・。
tkmakwins15さん、toyoさんありがとうございました。
今後ともよろしくお願いします。