OKWAVEのAI「あい」が美容・健康の悩みに最適な回答をご提案!
-PR-
解決
済み

文字コードから文字列への変換

  • 困ってます
  • 質問No.206629
  • 閲覧数65
  • ありがとう数1
  • 気になる数0
  • 回答数1
  • コメント数0

お礼率 88% (361/410)

よくわからないタイトルですみません(汗。

標準入力からデータを渡すと、I/Oをしてくれるというモジュールを書いているのですが、当初、テキストのみの設計のつもりだったのが、バイナリを扱うはめになってしまいました。
それで、バイナリはstdinから読めなさそうだったので、0xXYZという文字列にしてからstdin経由で渡そうと思ったのです。

今回の質問は、その文字列で書かれた16進コードを文字に直す方法なのです。
つまり、char buf[80] = "0x414243"という文字列を渡した場合、char buf2[80] = "ABC" という文字列を得たいのです。(0x41="A")

変な希望ですが、何通りか試したのですが、根っからのテキスト処理大好きPerl人間なので、Cの知識の無さに挫折してしまいました。

アドバイスをよろしくお願いいたします。
通報する
  • 回答数1
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

質問者が選んだベストアンサー

  • 回答No.1
レベル14

ベストアンサー率 50% (1122/2211)

> それで、バイナリはstdinから読めなさそうだったので、

そんなことはありません。使っているOSによって多少違うのですが、setmode() や fcntl() と
言う関数を使います。

それらの関数には、ファイルディスクリプタという整数を引数にとるのですが、stdin の
ファイルディスクリプタは普通0です。

# stream から取得する関数があったはずなのですが、思い出せません (^^;


> その文字列で書かれた16進コードを文字に直す方法なのです。

安直なのは sscanf() を使う方法かなあ。

エラーチェックなんかを全部はしょってますが、以下のような感じ。

#include <stdio.h>

int conv(char* in, char* out)
{
  int ch;
  char* p = in + 2;
  while (*p) {
    sscanf(p, "%2x", &ch);
    *out++ = ch;
    p += 2;
  }
  *out = '\0';

  return 0;
}

int main()
{
  char buf[80] = "0x414243";
  char buf2[80];
  conv(buf, buf2);
  printf("'%s' --> '%s'\n", buf, buf2);

  return 0;
}

渡される文字列の先頭が "0x" じゃないとき、とか、きちんと二桁単位で記述されて
いるとか、16進数として妥当なコードだとか、チェックすることはいっぱいありそうです。
お礼コメント
pythian

お礼率 88% (361/410)

助かります、ポインタ駄目人間なので、記述法がとても参考になりました。
無事に、0xを判定して渡せるようになりました。
もっと精進しないといけませんね(^^;;
どうもありがとうございました。
投稿日時 - 2002-01-28 17:02:31
-PR-
-PR-
このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ