16進数TCHAR文字列をunsigned int にする方法 – プログラミング – Home

16進数TCHAR文字列をunsign...
 
通知
すべてクリア

[解決済] 16進数TCHAR文字列をunsigned int にする方法


なおぞう
 なおぞう
(@なおぞう)
ゲスト
結合: 9年前
投稿: 143
Topic starter  

お世話になります。

VS2013 Unicode文字セット 標準Windowsライブラリを使用する
の環境で開発しています。

ファイル名 test_FFFFFFFF.txt が存在するとして、ファイル名のIndexとなっている
FFFFFFFFを、unsigned int に置き換えたいのですが、良い方法がないかと探していると
ころです。

16進数をintに変えるというので探したところ、
int i;
StrToIntEx(TEXT(0xFFFFFFFF), STIF_SUPPORT_HEX, &i);
で数値を取得し、-1のままでは困るので、
unsigned int ui = i;
とする方法が見つかりました。

この関数の第一引数(変換元文字列)には、ちゃんと16進だという 0x を付けないと駄目
なようです。
スマートに16進文字列をunsigned intに変更する方法がないかと探しているのですが、良
い方法はないでしょうか?

できるだけCStringは使いたくないのです。

よろしくお願いします。


引用未解決
トピックタグ
tetrapod
 tetrapod
(@tetrapod)
ゲスト
結合: 21年前
投稿: 830
 

strtoul とか。


返信引用
なおぞう
 なおぞう
(@なおぞう)
ゲスト
結合: 9年前
投稿: 143
Topic starter  

>tetrapod 様

ありがとうございます。

教えていただいた、cstoulをヒントに探してみたら、

TCHAR* e;
unsigned int ss = _wcstoui64(
FFFFFFFF,
&e,
16
);

が見つかりました。unsigned long でも良いのですがこれを使おうと思います。
助かりました。
…検索が下手すぎますね。


返信引用
tetrapod
 tetrapod
(@tetrapod)
ゲスト
結合: 21年前
投稿: 830
 

そのコードコンパイル通る?ダメでしょ。 _TCHAR の扱いわかってる?

いまさらだけど _TCHAR を扱うのであれば strtoul でなくて _tcstoul だし
i64 版がよければ _tcstoui64 だよ。

16進表記文字が8桁より多く出現した場合を考えて i64 なんだろうけど
その結果を無造作に扱っているのは気になる・・・
_TCHAR と言いながら _T() を表記してないのもかなり減点。

_TCHAR* e;
unsigned __int64 ss=_tcstoui64(_T(ABCD1234), &e, 16);


返信引用
なおぞう
 なおぞう
(@なおぞう)
ゲスト
結合: 9年前
投稿: 143
Topic starter  

>tetrapod様

ご指摘、アドバイスありがとうございます。
こちらに書くときにコピーしなかったので、TEXTを書き忘れたようです。テストプログラ
ムでは、以下のように記述して確認しましたが、コンパイル通りました。

unsigned int ss = _wcstoui64(
TEXT(FFFFFFFF),
&e,
16
);

文字セットが「Unicode文字セット」なので、利用したい関数を見つけたら「_UNICODE が
定義されている場合」として紹介されている関数を利用するようにしているのですが、そ
の考えって正しいのでしょうか? TCHAR型の文字を使うのであれば、TCHAR.Hのルーチンを
使うのが正しいのでしょうか。この場を借りて教えていただけると助かります。

TCHAR.H のルーチン       _tcstoul
_UNICODE が定義されている場合  wcstoul


返信引用
仲澤@失業者
(@uncle_kei)
Prominent Member
結合: 5年前
投稿: 828
 

面倒くさいことを言うようで申し訳ないのですが、厳密には

unsigned int ss = _wcstoui64(// 関数がUnicode用
LFFFFFFFF, // なので明示的にUnicodeを与えること
&e,
16
);

ですね。

追加で、unsigned 整数を戻す文字列変換関数は、
「負」の値を意味する場合の文字列を変換できません(エラーを意味する値が戻る)。
最終的にunisigned にしたい場合でも、signed を戻す関数を
使用した方が良いそうです。

以下はtetrapodさんの大昔の発言(これ、自分も助かりました)。

http://hpcgi1.nifty.com/MADIA/Vcbbs/wwwlng.cgi?print+200506/05060078.txt

つまり_wcstoi64()の方を使った方が良いかも、というお話です。


返信引用
tetrapod
 tetrapod
(@tetrapod)
ゲスト
結合: 21年前
投稿: 830
 

TCHAR はコンパイル時にプログラム内部文字表現を変えるもの。

TCHAR をコンパイル時に char に置き換えるのが _MBCS build (Win9x で性能向上用)
TCHAR をコンパイル時に wchar_t に置き換えるのが _UNICODE build (NT/XP で性能向上)

TCHAR が char になるとき _tcstoui64 は _strtoui64 に置換される
TCHAR が wchar_t になるとき _tcstoui64 は _wcstoui64 に置換される
逆方向は無い (TCHAR->char または TCHAR->wchar_t 方向のみ置換)

というわけで、正しい組み合わせは
固定で char を使う場合 _strtoui64(ABCD ...)
固定で wchar_t を使う場合 _wcstoui64(LABCD ....)
切り替え可能に作る場合 _tcstoui64(_T(ABCD) ....)
のどれか。

_wcstoui64(_T(ABCD) ...) と書いてしまうと MBCS build で失敗してしまう
_strtoui64(_T(ABCD) ...) と書いてしまうと UNICODE build で失敗してしまう
という意味で正しくない。

_UNICODE ビルド設定でも MBCS 関数を使っていい (切り替えないで固定なら)
_MBCS ビルド設定でも UNICODE 関数を使っていい (切り替えないで固定なら)

XP 以後は Windows の内部処理が UNICODE なので、
我々末端プログラマが作るソフトの内部コードも UNICODE にしておくほうが高速です。
なので Win9x 系が死滅している今ならば
文字表現切り替え機構である UNICODE/MBCS build のことは忘れて
UNICODE 系表記 _wcstoui64(LABCD ...) とするのがわかりやすいだろうと思う。


返信引用
なおぞう
 なおぞう
(@なおぞう)
ゲスト
結合: 9年前
投稿: 143
Topic starter  

>仲澤@失業者 様、tetrapod様

丁寧な説明ありがとうございます。

TCHARは、コンパイル環境に合わせてchar/wchar_tに切り替えてくれるのですね。だか
ら、char型ではなく、TCHAR型を使うようにって言われているのかもしれません。

UNICODE系の場合は、 _T( ではなくて、Lを使うのですね。確かにデバッガでみると、
L文字列”ってなっています。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました