MFC   VC++   Visual Studio   Visual Studio   プログラミング

16進表記の文字列を数値に変換

 16進表記(0xFF45A/45FA)の文字列を数値に変換するには「strtol」などありますが、これだとlong値への変換になるため、大きな数値(LONG_MAXより上)への変換が出来ません。
 そこで、今回はULONGLONGへ変換できる自作関数を紹介します。

 一応、MFCについてのブログなので、MFCを使って書いていきます。
 関数は、16進表記の文字列をCStringで受け取り、数値に変換したあとULONGLONG値を返すようにします。
 やり方は、一文字ずつlong値に変換し、それらを桁位置で16のべき乗したものをULONGLONG値へインクリメントしていくだけです。
ULONGLONG CXXXX::StrToUll(CString strNum)
{
TCHAR* strEnd; // 変換不可能用
long num[16]; // 16桁分用意
ULONGLONG ullSize = 0; // 0で初期化
int iLen = strNum.GetLength();
for(int i=0; i<iLen; i++)
{
num[i] = _tcstol(strNum.Mid(i, 1), &strEnd, 16);
ullSize += num[i] * (ULONGLONG)pow(16.0, (iLen - (i + 1)));
}

return ullSize;
}
 注意点として、「pow」を使っているので「math.h」をインクルードし、変更不可能文字がある場合や、桁数が多い場合のエラー処理などが入っていないため、関数を呼ぶ前にチェックして下さい。

 使い方の一例を書くと、
	CString str(_T("ffAb456"));

CString strCheck;
strCheck = str.SpanIncluding(_T("0123456789ABCDEFabcdef"));
if((strCheck != str) || (str.GetLength() > 16))
{
MessageBox(_T("エラーです"));
return;
}
ULONGLONG ulSize = StrToUll(str);
となり、「ulSize」は「268088406」になります。

 上記の例では変更不可能文字のチェックに「SpanIncluding」を使っていますが、別の方法として「SpanExcluding」を使うとか、「MakeUpper」を使い大文字にしてからチェックするとか、その辺は好みや状況で変更して下さい。
 その他に「StrToUll」関数の「strEnd」を使ってエラー処理する方法もあります。
 あと、文字列の長さから桁数が多い場合もエラーにするようにしてあります。

 ここで、16進数の表記で「0xFF55」のように「0x」がついている場合は、前もって「0x」を取り除くなど状況に応じて各自工夫してみて下さい。
ランキングへ     posted by 遠雷 | Comment(2) | MFC
この記事へのコメント
Visual Studio 2010から、unsigned long longへ変換するstrtoull関数が使えますよ、一応念のため。
http://msdn.microsoft.com/ja-jp/library/vstudio/ee404774.aspx
Posted by egtra at 2013年07月21日 03:02
egtra さん
コメントありがとうございます。

ホントですね!VS2010から直接文字列をULONGLONGに変換できる関数が実装されたんですね。
ただ、"strtoull"ではなく"stoull"ですね。

Windowsも64ビット化が進み、使用可能メモリ領域も広がり、時間の取り扱いも8バイトになったりで、8バイト型を使うことが多くなったので対応したんでしょうね。
以前はファイルも、NTFSじゃないとULONGを超えるファイルサイズが扱えなかったりしましたからね。

今回は貴重な情報ありがとうございました。

ちなみに、私は今でもXPとVS2008の環境なので、まだその恩恵にあずかれないですが・・・。
Posted by 遠雷 at 2013年07月21日 10:29
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
※ブログオーナーが承認したコメントのみ表示されます。