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

ファイルの中身を0と1で表現したい。

  • 暇なときにでも
  • 質問No.228332
  • 閲覧数55
  • ありがとう数1
  • 気になる数0
  • 回答数1
  • コメント数0

お礼率 55% (56/101)

私の父(パソコン初心者)はどこで聞いたのか、「パソコンっていうのは、0と1だけで構成されているんだよな。どうやったら見えるんだ」と言いました。

要するに、ファイルを指定して、0と1でそれが表示できればいいんだと思います。
私のPC(Windows98SE)にはVC++6.0が入ってまして、簡単だったら作ってみようと思いました。
私は、言語はC言語しか知らないので、C言語で考えてみようと思いました。

実は私のてもとには『C言語プログラミングの落とし穴』(柴田望洋著)という本がありまして、「ファイルのダンプ」というほとんどそれに近いようなプログラム(1ページくらい)があり、16進数で表現するようです。

そのプログラムの骨組みを書きます。


main関数とdump関数というもので構成されています。
main関数はファイルをオープンしてファイルポインタ(FILE*)をdumpファイルに渡し、最後にクローズするだけです。
dump関数は、ファイルポインタを受け取ります。dump関数の一番大切と思われるところを抜き出します。

void dump(FILE *src, FILE *dst)
{
.....
while ( (n = fread(buf, 1, 16, src) ) > 0 ){
.....
for( i=0; i<n; i++)
fprintf(dst, "%02X ", (unsigned)buf[i]);
.....
}
.....
}

あとは単に、2進数で表現すればいいのだろうと思います。
そうだとしたら、2進数で表現するにはどうすればよいですか。

16進数を2進数に変換する部分を作ればよいのでしょうか。

尚、父のPCはWindowsXPです。
通報する
  • 回答数1
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

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

  • 回答No.1
レベル12

ベストアンサー率 48% (325/664)

以下のように変更したら2進数表示できると思います。
なお、ソースを見やすくするため、スペースは全角にしてあります。コピー&ペーストする場合は半角に変換してください。

for( i=0; i<n; i++)
fprintf(dst, "%02X ", (unsigned)buf[i]);
   ↓
for ( i = 0; i < n; i++ ){
 unsigned int filter = 0x80;
 int j;
 for ( j = 0; j < 8; j++ ){
  fprintf( dst, "%c", ( ( (unsigned)buf[i] & filter ) ? '1' : '0' ) );
  filter >>= 1;
 }
}

なぜこれでいいかと説明しようとも思ったのですが、どうやらCの学習中のようですので、ヒントだけ書きます。

ヒント:3項演算子、ビット演算子
補足コメント
aabbccddeeff

お礼率 55% (56/101)

たいへんご回答ありがとうございました。

自分で解説します。

自分で解説するのもへんですが、、、、

私の質問で挙げた元のプログラムでは、
n = fread(buf, 1, 16, src)
でファイルから読み込むんですが、
1というのは要素1個の大きさ(この場合、1バイト)で、16というのは要素の個数で、
1バイトを16個取ってきて、bufに格納するということです。
bufは16バイトの大きさを持つ配列です。(unsigned char buf[16]; と宣言されている。)
fread1回の読み込みで16バイト読み込みます。

nは読み込み要素数なので、たいてい16になります。(16じゃない場合もあります。)
fprintf(dst, "%02X ", (unsigned)buf[i]); と Xを使って書いてあるので、1バイトが16進数で表現されます。02X というように2桁で 16×16 = 256 となる。

あとは、ご回答どおり、この部分(fprintfの部分)を変えます。

ご回答の部分について解説します。
filter(0x80)とは2進法で 1000 0000 です。(8ビット)
1バイトとは8ビットです。
> for ( j = 0; j < 8; j++ ){
>  fprintf( dst, "%c", ( ( (unsigned)buf[i] & filter ) ? '1' : '0' ) );
>  filter >>= 1;
> }
この部分は、1バイトぶんの処理をしています。
jを0から8未満まで(0から7まで)行うのは、8ビットぶんの処理を行うからです。
& はビット演算子で、論理積をとります。
その結果が真(0以外)ならば、'1'を表示します。0ならば'0'を表示します。
filter >>= 1 で、右にずらしていきます。
buf[i]のなかのビットを左から表現していきます。


まだ実際にやっていません。あとは、やってみるだけです。
投稿日時 - 2002-03-03 15:58:40
お礼コメント
aabbccddeeff

お礼率 55% (56/101)

やってみたらできました。多分大丈夫だと思います。
ありがとうございました。
投稿日時 - 2002-03-04 22:45:25
-PR-
-PR-
このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

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

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

特集


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

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ