私の父(パソコン初心者)はどこで聞いたのか、「パソコンっていうのは、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です。
No.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]のなかのビットを左から表現していきます。
まだ実際にやっていません。あとは、やってみるだけです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# 至急教えてください。プログラミングの問題です。 最初に正の整数nの入力を受け付け、次に分数の分子と分 1 2022/07/19 17:03
- C言語・C++・C# 至急教えてください。プログラミングの問題です。 malloc関数を使ってください!お願いします! 最 1 2022/07/21 09:28
- Visual Basic(VBA) ファイル全てを .xlsm に変更したところ、プログラムが途中で落ちてしまっています 17 2022/12/07 12:03
- C言語・C++・C# 至急お願いします。プログラミングの問題です。 最初に正の整数nの入力を受け付け、次に分数の分子と分母 3 2022/07/19 17:09
- C言語・C++・C# C言語について教えて欲しいです。 ファイルの中身をコピーするプログラムを作ってます aというファイル 7 2022/11/03 19:21
- C言語・C++・C# プログラム内から、MIDIファイルの一部分だけを再生する方法 1 2023/02/15 11:08
- Visual Basic(VBA) Excel-VBAでのファイルの開き方 4 2023/02/14 11:01
- PHP htmlspecialcharsが機能していないです。 バグですか? 1 2022/04/05 01:22
- Visual Basic(VBA) vba メモリ節約 3 2022/09/16 21:45
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語初心者の質問失礼します。
-
ドラッグアンドドロップでファ...
-
iniファイルに追記がしたいです。
-
ASP .NETでファイル選択ダイア...
-
WAVファイル同士の結合が可...
-
csvファイルを開かずに文字を検...
-
ファイル名の先頭にアンダース...
-
Excelマクロでの再読込み方法
-
C言語のfopenについて教えてく...
-
複数ブックの統合について Exce...
-
fopenの"r+"モードで同時に読み...
-
htmlを置換する方法とjsp表示
-
複数のファイルからのデータの...
-
ファイルを開かずにカスタムド...
-
VBAにてEXCEL以外のファイル(テ...
-
Arduinoでのライブラリファイル...
-
大きいサイズのテキストファイ...
-
2つのCSVファイルの比較
-
アドレス帳WABファイルをサンダ...
-
ファイルクローズとメモリ使用...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語初心者の質問失礼します。
-
csvファイルを開かずに文字を検...
-
ファイル名の先頭にアンダース...
-
CSVファイルへの保存の際、デー...
-
ファイルを記録してあるセクタ...
-
テキストファイルの最終行を削...
-
SGファイルって何ですか?
-
ドラッグアンドドロップでファ...
-
分割コンパイルの#defineについて
-
VBに、Cのincludeのようなもの...
-
fopenできる上限の変更
-
グローバル変数のよくない使い...
-
ファイルの結合
-
大きいサイズのテキストファイ...
-
iniファイルに追記がしたいです。
-
バッチで118項目のCSVを処理し...
-
ハッシュの計算時間について
-
C言語のfopenについて教えてく...
-
Javascript で INI の読み書き
-
Excelマクロでの再読込み方法
おすすめ情報