• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:ファイルの中身を0と1で表現したい。)

ファイルの中身を0と1で表現する方法とは?

hitomuraの回答

  • ベストアンサー
  • hitomura
  • ベストアンサー率48% (325/664)
回答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項演算子、ビット演算子

aabbccddeeff
質問者

お礼

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

aabbccddeeff
質問者

補足

たいへんご回答ありがとうございました。 自分で解説します。 自分で解説するのもへんですが、、、、 私の質問で挙げた元のプログラムでは、 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

  • JavaでC言語のポインタ演算風な使い方は

    Java初心者です。ずっとC言語をやっていました。 Javaにはポインタは存在せず(実際は参照渡しなのでポインタその ものなのですが)、ポインタに対する演算はありませんよね。 C言語で、 int buf[2*10]; int *dst = buf; for(i=0;i<10;i++){ dst[0]=a; dst[1]=b; dst += 2; } のようなソースをJavaで書こうとすると、 for(i=0;i<10;i++){ buf[i*2+0]=a; buf[i*2+1]=b; } しか思いつきません。 コンパイルして最適化されれば問題ないと思いますが、 なんか配列中の演算が演算量をとりそうで、気になっています。 もっと高速に処理されるような書き方はないものでしょうか? アドバイスよろしくお願いします。

    • ベストアンサー
    • Java
  • 配列表現とポインタ表現

    配列とポインタの2通りの表現で表せる場面によく遭遇します。例えば、pというdouble型の配列に乱数を10個発生させて格納したい時など、 for(i=0;i<10;i++) *(p+i) = (double) rand(); for(i=0; i<10; i++) p[i] = (double) rand(); のように、配列とポインタの2通りの表現が考えられると思いますが、複雑な場合などは特に、見た感じは配列のほうが分かりやすいと思います。 まだ、C言語の初級から中級向けの本しか読んでいないのですが、標準関数の多くがポインタを引数や返り値としていることを知りました。わざわざポインタ表現にすることの意義は、実行速度が上がることと、標準関数の多くがポインタを引数や返り値としているからと理解して良いのでしょうか。

  • C言語です。コレを使ってなにかプログラミングを組んでください

    C言語です。コレを使ってなにかプログラミングを組んでください よろしくお願いします 何でも構いません #include<stdio.h> void str_copy( char dst[], char src[] ) { int i; for (i =0; src[i] != '\0'; i++) { dst[i] = src[i]; } dst[i]= '\0'; }

  • プログラムがわかりません

    C言語の本を読んでいるんですが、詰まってしまいました。プログラム自体は単純なのですが #include<stdio.h> void hello(void) { fprintf(stderr,"hello!\n"); } void func(void) { void *buf[10]; static int i; for(i=0;i<10;i++) { buf[i] = hello; } } int main(void) { int buf[100]; func(); return 0; } のスタックオーバーフローのプログラムです。 1. 要素100のint型配列を宣言 2. 関数funcの呼び出し 3. void *buf[10]; まずここでがわかりません。なぜポインタが   でてきたのか?またbufの要素数は100では? 4. buf[i] = hello; のループ    これもわかりません。配列に関数を代入しているのでしょうか?     5.  fprintf(stderr,"hello!\n"); これもまたわかりません。    fprintfの最初の引数は出力先ですが、なぜ標準エラー出力なの   でしょうか? 時間のあるかた解説お願いします。

  • C#で、Cのファイルポインタ(?)のような機能

    プログラムの初心者、かつ、C#の初心者です。  C言語では、ファイルポインタを関数から関数へ渡すことができると思うのですが、C# ではどのようにすれば良いのですか? C#を使っていますが、C言語のような構造でプログラムを書いています。  やりたいことは、ファイルポインタを渡しながら、各関数で、ドカドカと計算結果をファイル内に書いていくということです。  宜しくお願いいたします。

  • Cで多様性を表現するには

    こんにちは、あっちこっちとウェブを検索しましたが これと言った答えが見つからないので書かせていただ きます。 C言語で多様性を表現するにはどのようにすればいいで しょうか?関数ポインタを使用すると出来そうだと言 うとこまでは理解したのですが・・・ 以下にJavaで書いたものをCでどうやって表現したら 良いかご教授ください。また、参考になるポインタな どもあれば宜しくお願いします。 public interface MoverIF{  public void run(); } public class Car implements MoverIF{  public Car(){}  public void run(){   System.out.println("Car run");  } } public class Dog implements MoverIF{  public Dog(){}  public void run(){   System.out.println("Dog run");  }  public static void main(String arg){   MoverIF mi[] = new MoverIF[2];   mi[0] = new Dog();   mi[1] = new Car(); for(int i=0;i<2;i++){ mi[i].run();  } }

  • c言語 iconv

    msys環境で実行して,指定されたファイルの文字コードをShift-JISに変換して表示するコードを作成しているのですがうまく表示されません.何がいけないのでしょうか.第1引数に変換対象のファイル名,第2引数にファイルの文字コードを指定しています. #include <stdio.h> #include <string.h> #include <iconv.h> int main(int argc, char *argv[]) { iconv_t conv; char src[10000]; char dst[10000]; int src_len = strlen(src); int dst_len = sizeof(dst) - 1; char *buf_in; char *buf_out; FILE *fp; fp = fopen(argv[1], "r"); if(NULL == fp) { printf("ファイルを開けません\n"); } else { while(fgets(src, 10000, fp) != NULL) { buf_in = src; buf_out = dst; /* 変換器を作成 */ conv = iconv_open("Shift-JIS", argv[2]); /* 変換 */ iconv(conv, &buf_in, &src_len, &buf_out, &dst_len); *buf_out = '\0'; /* 終末処理 */ /* 文字コード後の文字列を表示 */ printf("%s\n", dst); } /* 変換器を終了 */ iconv_close(conv); /*ファイルを閉じる*/ fclose(fp); } return 0; }

  • 配列を返す

    ファイルから読み込んだ一行の文字列を読み込みカンマごとに区切って 返すというプログラムを関数化することで効率を図りたいと思います。 int main() { char buf[1000]; char *str; char *bufG; //ファイルを読み込む  while(fgets(buf,1000,fp) != NULL){//一行ずつ読む str = buf;//先頭アドレスを指す     bufG = //文字列を返す関数  ・  ・  ・ } } //文字列を返す関数 {    for(i = 0; *str != ',' && *str != '\0'; i++){ if(*str == '\n'){ bufG[i] = '\0'; } else{ bufG[i] = *str; } str++; } bufG[i] = '\0'; return bufG; } 前の質問で自動変数でこの関数を抜けたら廃棄になるというのは わかったんですが(そういう警告がでました) ここからどのようにすれば求めるプログラムになりますか? 引数とかちょとわからないので関数定義を書きませんでした。 (1)ファイルをよみこむ (2)一行ずつ読み込み文字列をbufにいれる (3)ポインタstrをbufの先頭アドレスにする (4)get_word関数にてポインタをずらしていき カンマがあればそこまでの文字列を返す (5)main関数に戻り変数に代入する (6)終端文字があるまで(4)ー(5)を繰り返す。 (7)さらに行数分繰り返す これらの一連の流れをやりたいのですが わかりません。

  • ファイルポインタが動かない・・・

    ファイルポインタがfgetしても動かなくなるような宣言の仕方や 引数の渡し方ってあるのでしょうか? C言語で書いたプログラムです(長いので構造を書きます) わかりにくければ補足します。 #include"stdio.h" static FILE fp1; main() { 変数宣言うんぬん プロトタイプ宣言うんぬん fopen(.....); a = kansuu; fclose; } int kansuu() 変数宣言うんぬん for(i=0;i<3;i++) { x=fgetc(fp1); printf("%d-%d\n",x,ftell(fp1)); } ファイルには 0123456789 出力が 0-0 0-0 0-0 ってなるんです Seek関数(SEEK_CURとか)を使うとファイルポインタは動きます。 お願いします。

  • C言語でのコマンドライン引数の内部での処理のされ方

    C言語でint main(int argc, char *argv[])とメイン関数を宣言します。 2番目の引数はC言語の文法的にいうと文字列へのポインタの配列だとおもいますが、一般的な関数でこの引数に値を渡すとすると、以下のように宣言されたポインタ配列を渡すことになるとおもいます。 ・宣言 char *pa[]; ・関数への渡し func(pa); 話が元に戻りますが、main関数でもらう場合は、プログラム外部から与えられた引数は(正確に言うとアドレス)、メモリ上ではC言語で書かれたexeファイルの外から実行時にプログラムファイルのメモリ上にコピーされるのでしょうか? 自分でもうまく表現できないのですが、 ・コマンドプロンプトで引数を与えて実行         ↓ ・プログラムファイルのメモリ上に引数がロードされる ということでいいんでしょうか? 自分でもなんだかうまく表現できないので、お暇な方でよろしいので、気が向いた人、回答ください。 よろしくお願いします。