電子書籍の厳選無料作品が豊富!

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

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

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

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

アドバイスをよろしくお願いいたします。

A 回答 (1件)

> それで、バイナリは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進数として妥当なコードだとか、チェックすることはいっぱいありそうです。
    • good
    • 0
この回答へのお礼

助かります、ポインタ駄目人間なので、記述法がとても参考になりました。
無事に、0xを判定して渡せるようになりました。
もっと精進しないといけませんね(^^;;
どうもありがとうございました。

お礼日時:2002/01/28 17:02

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!