C言語関係掲示板

過去ログ

No.135.ASCII文字をバイナリに変換


No.851

ASCII文字をバイナリに変換する処理をしたいのですが。。
投稿者---ひよこ(2002/01/16 23:00:26)


それと、strtol関数を使わなければならないのですが、
下記の説明を読んでも、基数をどう表すのか
分かりません。基数は2進数、10進数、16進数の
桁上がりということは分かるのですが、
どう表すのでしょうか?

*strtol関数について
long int strtol(const char *nptr, char **endptr, int base);


((説明))
strtol() 関数は nptr の文字列を、 base を基数として long int に変換する。
この base は 2 から 36 までの値あるいは特別な意味を持つ値 0 (後述)でなければならない。
文字列の先頭には、任意の数の ( isspace(3) で定められる) 空白があってもよく、
また数字の直前には `+' か `-' があってもよい。
base がゼロまたは 16 の場合には、 `0x' ではじまる文字列は 16 進数として扱われる。
これ以外の文字列に対して base がゼロの場合は、 `0' で始まる文字列は 8 進数として、
それ以外の文字列は 10 進数として扱われる。

数字を表す文字列は long int に変換されるが、
基数に対して有効でない数字が現れた時点で変換は終了する。
(11 進数以上では `A' は大文字・小文字に関わらず 10 を表し、
`B' は 11 を表現し、以下同様に、 `Z' は 35 を表す。)

endptr がヌル値 (NULL) でない場合は、最初に現れた不正な文字が
strtol() によって *endptr に保存されている。
文字列に有効な数字がひとつもなければ、 strtol() は nptr の元の値を
*endptr に代入する(そして 0 を返す)。
特に、*nptr が `\0' 以外で、戻された **endptr が `\0' ならば、
文字列全体が有効だったことになる。

・返り値
変換された値が返される。オーバーフローした場合には LONG_MAX が返され、
アンダーフローした場合には LONG_MIN が返される。
オーバーフロー、アンダーフローのいずれの場合にも大域変数 errno には
ERANGE が設定される。

ソース、途中からですが。。。

fp = fopen( "shelf/name_tel_list.txt", "t" );


/* エラー表示 */
if ( fp == NULL ){
printf("ファイルがオープンできません。\n" );
return(-1);
}
/* 成功表示 */
else
{
printf("fopen Success!!\n");
}

///////////////////////////////////////////////////
  // fgets 関数 //
// 入力領域      : buf //
// 入力最大文字数 : 500 //
// 開いたファイルから読み込む : fp //
///////////////////////////////////////////////////
while (fgets(buf, 500, fp) != NULL)
{
printf("%s",buf);
→ここに処理を入れたい
}

分かりにくい投稿ですが、どうぞ宜しくお願いします。


No.857

Re:ASCII文字をバイナリに変換する処理をしたいのですが。。
投稿者---kikk(2002/01/17 18:00:27)


ども。


>それと、strtol関数を使わなければならないのですが、
「それと、」というのはタイトルからつながっていると判断します。


1文字ずつとってきてバイトごと格納とか、8桁分くらいとってきてintで格納
とかいろいろあって、バイナリに変換といっても具体的に何をすることを
指しているのかはよくわかりませんが(もし1つ目の場合は何も変換する必要
はありません)。

本当にstrtol()が必要なのか検討してみてください。また、atoi()ないし
atol()が必要という結論がでたならば、多くの場合、それはstrtol()の
ほうがいいでしょう。エラーチェック(後述)しなければおんなじですが。
また、scanf()系で簡単に済ませられるかもしれません。

以下は、タイトルを「"12345"といった文字列をint等の数値として変換する
には」と判断したものとします。間違っていたら訂正してください。。


strtol()はatoi()やatol()と似ています。主な相違点は、10進以外も扱える
ことと、読み込みエラーの検知および原因の場所の特定ができることです。

atoi()と似ているということからわかると思いますが、strtol()は数値が
文字で格納されている(はずの)文字列を、実際の数値に変換する関数です。


>long int strtol(const char *nptr, char **endptr, int base);

nptrは入力文字列を指定します。
baseは基数(<=36)を指定します。0の場合は自動判別します。n進数の場合、
文字は0123456789abc...xyzのn番目までが各桁の数字として使われます。
endptrはエラーチェック用です。NULLを指定する(チェックなし)ことも可能
です。チェックしたい場合はポインタのポインタを指定してください。変換
後に変換が終わった位置を指しています。またオーバーフローが発生した
場合はLONG_MAXかLONG_MINを返します。結局、エラーが無いことをこの関数
の範囲でチェックするには、endptrがnptrの末尾の'\0'を指していて、
かつ、返り値がLONG_MAXかLONG_MINでないことを調べることになります。

使用例:
char *perr;
char str[] = "12345#678";
long ret;

ret=strtol(str,&perr,10); /* perrはstr[5]を指す */

/* エラーチェックすること! */


なお、strtol()は"STRing TO Long"です(たぶん)。


では。

No.908

Re:ASCII文字をバイナリに変換する処理をしたいのですが。。
投稿者---ひよこ(2002/01/22 01:25:03)


ありがとうございました。
お礼を言うのが遅れて申し訳ありません。

参考にさせていただきました。
まだ未完成ですが、なんとかできそう(?)です。

よく自分のもっているテキストでは説明が載っていない
関数をネットで調べるのですが、それでやっとの事で見つけても
説明が理解できず、使う事ができない事がよくあります。
みなさん、どうやって勉強しているのでしょう??

まだ自分の頭がプログラミングを覚える状態ではなく
頭にすんなり入ってきません。。。

やはり問題を地道に解いていくのが一番よいのでしょうね?

ありがとうございました。
また質問するかと思いますが、どうぞヨロシクお願いします。

戻る


「初心者のためのポイント学習C言語」 Last modified:2002.02.03
Copyright(c) 2000-2002 TOMOJI All Rights Reserved