CStringで読み込んだ文字列をバイナリ文字に変換するには?

解決


トウシロウオヤジ  2005-11-24 01:15:08  No: 59748

はじめまして。
VCを始めたばかりの超初心者です。
コンボボックスからCStringで取得した文字列をバイナリ化してファイルに書き込みたいのです。
具体例としては、"7B"(\x37 \x42)というCStringを、\x7Bとしてファイルに書き込みたいのです。リストで選択するのでアルファベットは大文字に限定されます。
範囲としては"00"〜"FF"→\x00〜\xFFです。"00 00"などはありません。
一発で変換できる方法があればそれに超したことはありません。
"00"〜"FF"まで全てをcase文で変換しようとも思いましたが、数値ではないためできませんでした。
最悪の場合、if文で単純力技変換もできますが、あまり感心できないと思いますので、うまく変換できる方法をご存じの方がおられましたら教えてください。


トウシロウオヤジ  2005-11-24 01:32:09  No: 59749

長くなりましたので、補足情報は追加発言として書き込みます。
環境はWindows XP, VC++6.0です。
せめて数値化できればcase文で力ずくにでもできますが、atoiなどではアルファベットは0(ゼロ)になってしまいます。
CStringに限定しているのは、コンボボックスの文字列を取得する方法として、私はCStringしか知らないからです。
テスト的にベタCでやったときは以下の方法でうまく行きましたが、VCではCString→unsigned charの変換もうまくできない始末です。
unsigned char*への変換はできましたが、その後がうまく処理できませんでした。

unsigned char input1;
途中省略
scanf("%x",&input1);
途中省略
fputc(input1, FP);

お知恵拝借、何卒よろしくお願いします。
質問内容が悪くてよくわからないときはご指摘下さい。


ひでらん  2005-11-24 02:02:25  No: 59750

1文字ずつ 変換してはどうですか?

dataに1文字ずつ入れて後は受け取った数字を
シフトしたり足したりして・・・

  if ((data >= '0') && (data <= '9')) {
    return (data - '0');
  } else if ((data >= 'A') && (data <= 'F')) {
    return (data - 'A' + 0x0a);
  }

だめかなぁ、俺いつもこれなんだけど。


KING・王  2005-11-24 02:30:31  No: 59751

trtol()の第3引数で16進数を指定して、一度unsigned longに変換すれば?


KING・王  2005-11-24 02:31:34  No: 59752

> trtol()の第3引数で16進数を指定して、一度unsigned longに変換すれば?
すいません、色々ミスりました。

strtoul()の第3引数で16進数を指定して、一度unsigned longに変換すれば?


みい  2005-11-24 02:35:40  No: 59753

> コンボボックスの文字列を取得する方法
GetWindowTextやGetDlgItemTextでやっているのならCStringではなく
char配列に入れることもできます。
strcpyでCStringをchar配列にコピーしたりする手もあり。

で、sscanfで"%X"変換してint型に入れた後にunsigned charにキャスト。
なんてのはいかがでしょうか?


トウシロウオヤジ  2005-11-24 03:03:07  No: 59754

みなさま、たくさんのアドバイスありがとうございます。
めんどくさがりの私は、一番シンプルそうなみいさんの方法で試しています。
int型にした後、unsigned charにキャストして書き込みってのはうまく行ってませんが、とりあえずint型にするところまではできました。
"0A"→10, "10"→16のように。
少なくともこれでcase文には持ち込めそうです。
結果出ましたらまた報告します。


トウシロウオヤジ  2005-11-24 03:48:18  No: 59755

みなさま、ありがとうございました。
できました。
みいさんの方式で、case文の力ワザも使わずに。
fprintf(FP, "%c", (unsigned char)int_type_data);で素直に書き出したらできました。
アドバイスありがとうございました。


PATIO  2005-11-25 01:49:01  No: 59756

解決のチェックをお忘れなく。

蛇足ですが、

>コンボボックスからCStringで取得した文字列をバイナリ化してファイルに書き込みたいのです。
>具体例としては、"7B"(\x37 \x42)というCStringを、\x7Bとしてファイルに書き込みたいのです。
>リストで選択するのでアルファベットは大文字に限定されます。
>範囲としては"00"〜"FF"→\x00〜\xFFです。"00 00"などはありません。

と言うことであれば、わざわざコンボボックスの文字列を変換するまでも無く
コンボボックスの選択中のインデックスで何とでもなったのでは?
設定範囲も固定でキーによる入力も考えないでいいのであれば、
ドロップダウンリストスタイルのコンボボックスにしてリスト内の文字列もリソースで設定しておいて
選択されたインデックスをそのまま使えば、万事OKだと思います。
他にどうしても文字列から変換したいと言うわけでもあれば話は別ですけれど。


トウシロウオヤジ  2005-11-25 04:10:46  No: 59757

PATIOさん、ご指摘ありがとうございました。
さらに、アドバイスもありがとうございました。
チェック入れました。
おっしゃるとおりですね、そっちの方がスマートですね。
どうせリスト用に00からFFまでひととおり書き出してるわけですから。
そっちの方法も試してみます。
やっぱり、こういう問題って解決してみると案外シンプルなんですね。
今後修行を積みます。
ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加