![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
よくわからないタイトルですみません(汗。
標準入力からデータを渡すと、I/Oをしてくれるというモジュールを書いているのですが、当初、テキストのみの設計のつもりだったのが、バイナリを扱うはめになってしまいました。
それで、バイナリはstdinから読めなさそうだったので、0xXYZという文字列にしてからstdin経由で渡そうと思ったのです。
今回の質問は、その文字列で書かれた16進コードを文字に直す方法なのです。
つまり、char buf[80] = "0x414243"という文字列を渡した場合、char buf2[80] = "ABC" という文字列を得たいのです。(0x41="A")
変な希望ですが、何通りか試したのですが、根っからのテキスト処理大好きPerl人間なので、Cの知識の無さに挫折してしまいました。
アドバイスをよろしくお願いいたします。
No.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進数として妥当なコードだとか、チェックすることはいっぱいありそうです。
助かります、ポインタ駄目人間なので、記述法がとても参考になりました。
無事に、0xを判定して渡せるようになりました。
もっと精進しないといけませんね(^^;;
どうもありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) python質問 1 2023/08/14 11:54
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- その他(プログラミング・Web制作) awkの文字列比較はPOSIXロケールまたはCロケールにおいてバイナリ値の比較に使えるか gawkな 1 2023/04/22 09:21
- その他(プログラミング・Web制作) プログラミング pythonの問題について 2 2022/04/19 00:41
- Excel(エクセル) エクセルでA列セル内で折り返すことなく、文字列を、B列C列・・・側に一行に 2 2022/07/23 02:02
- Visual Basic(VBA) エクセルVBAについて 2 2023/01/31 16:21
- Visual Basic(VBA) VBAで、特定の文字より後を削除して残った数値を文字列に変換と特定の文字より前も削除したい 3 2022/04/15 19:21
- Java Javaの問題なのですが、「3文字以上の英数字文字列を入力し、文字列の中に文字(9)が出てくるまでの 1 2023/06/06 18:55
- Excel(エクセル) エクセルで文字列と数字が混在する列に書式設定したい。 3 2022/12/19 09:11
- WordPress(ワードプレス) Wordpressの記事URLを自由に決めたい 3 2022/06/02 12:05
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
charでの計算?
-
c言語 暗号化のプログラム
-
文字列から空白を取り除きたい...
-
テキストデータをそのままバイ...
-
3桁区切(コンマ)記号をつけ...
-
enumの記述について。
-
絶対パスからのファイル名の切...
-
charからLPTSTRへの変換方法
-
str系関数を使わずに二つの文字...
-
'const char *' 型は 'char *' ...
-
YUV⇔RGB変換がうまくいきません。
-
英単語をアルファベット順に
-
C言語プログラミングについて(...
-
Linuxでフォルダ内全ファイル名...
-
atoi( ) の反対をやりたい
-
fgetsなどのときのstdinのバッ...
-
ファイル名である文字列からbas...
-
干支のプログラム
-
C言語です
-
iconv_open失敗
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
fgetsなどのときのstdinのバッ...
-
C言語のfor文です。 繰り返しの...
-
テキストデータをそのままバイ...
-
charでの計算?
-
文字列から空白を取り除きたい...
-
charからLPTSTRへの変換方法
-
atoi( ) の反対をやりたい
-
2曲同時再生するにはどうした...
-
C言語の入力した文字を反転させ...
-
配列をnビットシフトする
-
3桁区切(コンマ)記号をつけ...
-
int main()の・・・
-
型変換
-
CStringをwchar_tに変換したい
-
'const char *' 型は 'char *' ...
-
間接操作のレベルとは
-
double型の値をchar配列に変換...
-
絶対パスからのファイル名の切...
-
switch文で文字を比較すること...
-
c++ 文字列を入力して、一文字...
おすすめ情報