アプリ版:「スタンプのみでお礼する」機能のリリースについて

私の父(パソコン初心者)はどこで聞いたのか、「パソコンっていうのは、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です。

A 回答 (1件)

以下のように変更したら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項演算子、ビット演算子

この回答への補足

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

自分で解説します。

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

私の質問で挙げた元のプログラムでは、
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
    • good
    • 0
この回答へのお礼

やってみたらできました。多分大丈夫だと思います。
ありがとうございました。

お礼日時:2002/03/04 22:45

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