• 締切済み

テキストデータをバイナリデータに変換したい

テキストファイルに以下のデータがあるとします。 テキストデータの中身、 「 000E6D4181AA,1234567890ABCDEF 0123456789AB,0100000000000000 050505AAAAAA,0200000000000000 070707BBBBBB,0300000000000000 012345CCCCCC,0400000000000000 cdef01DDDDDD,0500000000000000  ・  ・  ・ 」 12桁の数値(16進数)と16桁の数値(16進数)を「,」で区切ります。1行の終端は改行しています。 このテキストファイルにあるデータを以下のバイナリ形式に変換させたいのです。バイナリ形式の各行の16バイト目は、テキストデータにはデータがないので、「00」とします。「,」で区切ったバイナリ形式は「2C」になると思います。 テキストデータの左上から順に「00」は以下の、左上から順の「00」に対応します。 バイナリデータの中身、 「 00 0E 6D 41 81 AA 2C 12 34 56 78 90 AB CD EF 00 01 23 45 67 89 AB 2C 01 00 00 00 00 00 00 00 00 05 05 05 AA AA AA 2C 02 00 00 00 00 00 00 00 00 07 07 07 BB BB BB 2C 03 00 00 00 00 00 00 00 00 01 23 45 CC CC CC 2C 04 00 00 00 00 00 00 00 00 CD EF 01 DD DD DD 2C 05 00 00 00 00 00 00 00 00  ・  ・  ・ 」 ソースコードでの例、 テキストデータ1行目の1つ目の「,」までのデータ「000E6D4181AA」を、メモリ領域に読み込む。2桁の数値を1バイトで格納する。 つまり、 char buf[6]とすると、 buf[0]=0xAA buf[1]=0x81 buf[2]=0x41 buf[3]=0x6D buf[4]=0x0E buf[5]=0x00 とこのようにメモリに格納したいのです。 格納するバイトオーダーはリトルエンディアン方式とします。 以上で、質問を終わりますが、質問が上手くできていないと思いますので、説明に不備があるかもしれません。その時はお手数ですが、連絡下さい。

  • burbe
  • お礼率35% (78/221)

みんなの回答

noname#7858
noname#7858
回答No.2

こんなんはどうですか。 void main(void){ FILE *fi,*fo; char buf[256]; fi=fopen("HexData.txt","r"); fo=fopen("binData.dat","wb"); while (fgets(buf, sizeof(buf)-1, fi)) { unsigned char c1[12/2]; unsigned char c2[16/2]; sscanf(buf, "%12I64x,%16I64x", (long*)c1, (long*)c2); fprintf(fo, "%02x %02x %02x %02x %02x %02x 2c " "%02x %02x %02x %02x %02x %02x %02x %02x 00\n", c1[5], c1[4], c1[3], c1[2], c1[1], c1[0], c2[7], c2[6], c2[5], c2[4], c2[3], c2[2], c2[1], c2[0]); } fcloseall(); } ※"I64"がどのコンパイラでもサポートされているかは知りませんが

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

/* とりあえず、こんな感じで */ #include <stdio.h> #include <string.h> #include <ctype.h> void main(void){ int c,x; FILE *fi,*fo; char table[]="0123456789ABCDEF"; fi=fopen("HexData.txt","r"); fo=fopen("binData.dat","wb"); while(EOF!=(c=fgetc(fi))){ switch(c){ case ',': fputc(',',fo); break; case '\n': fputc(0,fo); break; default: x=strchr(table,toupper(c))-table; c=fgetc(fi); x=x*16+(strchr(table,toupper(c))-table); fputc(x,fo); break; } } fcloseall(); }

関連するQ&A

  • バイナリデータとテキストデータの違いについて

    宜しくお願いします。 バイナリデータを用語辞典で調べると 「テキスト形式(文字データ)以外のデータ形式全般のこと。 実行可能形式のコンピュータプログラムや、画像や音声、 動画などのデータなどがバイナリデータにあたる。」 (http://e-words.jp/w/E38390E382A4E3838AE383AA.html) とあります。 これでは、バイナリデータとテキストデータの違いが分かりません。 テキストデータはコードの集まりで、 さらに細かくすると0と1の集まり(?)だから・・・ と考えるとバイナリデータとテキストデータの 違いが分かりません。 Q1.私は何が分かっていないのでしょうか? Q2.バイナリデータとテキストデータの違いを教えてください。 宜しくお願い致します。

  • C#でバイナリデータをテキストフォームへ表示させるには?

    C#でバイナリデータをテキストフォームへ表示させるには? C#でバイナリファイルをテキストへ変換するツールを作成しています。 バイナリデータを配列へ格納し、その配列をテキスト変換してテキストフォームへ出力させるという処理を作成したいのですが、どうすれば良いのかどうしてもわかりません。 どのようなコードをどのようにして書けばよいのか、ご教示いただけないでしょうか。 よろしくお願いします。 (ちなみにC#を始めて1週間ほどです)

  • 二つのデータを一つにデータにしたい

    題名の通りです。 二つのシートに、個人のデータが入っています。 二つのシートの両方に入力されている人もいれば、片方にしか入力されてない人もいます。 この二つのシートのデータから、一つの、全員のデータの入ったシートを作りたいのですが、何か良いやり方はないでしょうか? もちろん、両方に入力されている人は、一つのデータです。 また、項目も片方にしかない項目と、両方にある項目があります。 数が多いため、手入力だと時間がかかってしまいますので・・・ 文だと説明しにくいので、図を書いてみます。 シート1 ID 名前 住所 〒 1   A  AA 111-11 2   B  BB 222-22 4   D  DD 444-44 シート2 ID 名前 住所 年齢 1   A  AA 11 3   C  CC 33 5   E  EE 55 これを シート3 ID 名前 住所 〒   年齢 1   A AA 111-11  11 2   B BB 222-22 3   C CC      33 4   D DD 444-44 5   E EE       55 としたいので、『データの統合』機能は試してみたのですが、数字じゃないと、うまくいかないようだったので・・ すみませんが、宜しくお願いします。 また、長い文、読んでくれてありがとうございます。

  • テキストファイルのデータからバイナリを作りたい

    現在、テキストデータとしてCSVファイル1つあたり8バイトのデータが1000個ほどのデータが書かれているファイルがあります。このデータをバイナリファイルへ数値も変換して行きたいと思っています。 たとえば1個目のデータ”12345678”というテキストデータをバイナリの"12345678"に変換したらそれを0x00番地に並べて、そして2個目のデータ”87654321”というデータをバイナリにしたらそれを0x90離れた場所に置いていき、それを1000回繰り返して、結果をバイナリファイルで出力したいのですが、何か簡単にできるフリーソフトなどありませんでしょうか? また、プログラムとかでも簡単にできるのならそうしたいのですが、どうしたらよいか教えていただけないでしょうか?

  • エンディアンについて

    すみません。 教えてください。 リトルエンディアンからビッグエンディアンに変換しないと いけません。 エンディアンについては勉強したつもりですが、 どうしてもわからないことがあります。 ご存知の方、教えていただせんか? CPUはリトルです。 まず、エンディアンの違いについては 以下のように認識しています。 x = 0xAABBCCDD メモリの配置方法が、 トリルだと DD CC BB AA ビックだと AA BB CC DD だと思っています。32ビットの場合です。 で、これを変換するには、htonlで変換可能だと思っっています。 (試したところ可能でした) で次に、32ビットを超えるデータ、たとえば100バイトとかを mallocにして変数に代入しました。 この時はエンディアン変換(ファイルに出力する際)は必要ないのでしょうか? 試しに出力すると、 x = 0x AA BB CC DD EE FF GG ・・・・・・ZZ (100バイトと仮定) バイナリでの出力結果は AA BB CC DD EE FF GG ・・・・・となっていました。 私の認識だと、本CPUはリトルエンディアンのため、 ZZ ・・・・・・・・ DD CC BB AA (四バイトずつ反転しているデータ) が出力されるものと思っていました。(反転してメモリに格納されるため) リトル/ビックを意識しないといけないのは、 2バイトや4バイトの時のみで、それを超える大きなデータ(100バイト)などは 意識せず、そのままバイナリ出力しても、ビックエンディアンで出力されると いうことでよろしいでしょうか? そうなると、エンディアンってなんだんだ???と混乱しています。 わかりにくい説明で大変申し訳ござませんが、 よろしくお願いいたします。

  • エクセルで最後行に入力したデーターを自動で別の(ファイル)シートの任意の場所に自動で転記できるようにしたいのですが・・。

     全くの初心者です。よろしくお願いします。 初心者にもかかわらず無謀にもエクセルで最後行に入力したデーターを自動で別の(ファイル)シートの任意の場所に自動で転記し、上下が逆になる形にしたいと思います。 例) A B C D E F 1 a aa ab ac ad 2 b ba bb bc bd 3 c ca cb cc cd 4 d da db dc dd 行4に d da db dc ddを入力すると A B C D E F E 1 2 3 d da db dc dd 4 c ca cb cc cd 5 b ba bb bc bd          6 a aa ab ac ad          別(ファイル)シートの任意の場所へ挿入する形で転記され、入力のシートとは上下が逆になる。  何かよい方法がありましたら、よろしくお願いします。

  • C言語のsscanf関数の上手な使い方2

    質問NO.60489の追加です。 C言語で、 char buf[256] = "\"aa, aa\",100,\"bb bb\",200,\"cc-cc\"; char c1[10],c2[10],c3[10]; int i1,i2; のとき、 c1 = "aa, aa" c2 = "bb bb" c3 = "cc-cc" i1=100 i2=200 に読み込みたいのですが、 sscanf(buf,"\"%[^\"]\",%d,\"%[^\"]\",%d,\"%[^\"]\"",c1,i1,c2,i2,c3); では失敗します。 sscanfのformat部分をどのように書いたらよいか分かりません。

  • 配列から指定するデータを取り出す方法

    お世話になります。 今、 char buf[1500]に値が入っているのですが、 バイナリデータであり、テキストエディタで バイナリモードでみると、 54,00,00,32,00,00,40,00,FF・・・ となっています。 この3~4バイト目の0x00,0x32のを 10進数にした値を得たいです。 今回の質問点を下記します。 (1)bufに格納されている3・4バイト目の値を得るにはどうしたら  いいのでしょうか?memcpy()などでやるのか? (2)得た値を10進にするにはどうしたらいいでしょうか? どうぞよろしくお願い致します。

  • テキストデータをそのままバイナリへ

    初心者です。 テキストデータ(ASCII)として取り込んだ 「05 50 0E」 といった文字列を そのままバイナリデータ(16進)としての 「05 50 0E」 に変換したいのですが、こういった処理をする関数ってあるでしょうか? もしなければ作ってみたいのですが、その際の考え方や有用な関数などありましたら教えていただけると嬉しいです。

  • Google Chromeの同期について

    パソコンを2台使っていて、両方とも全く同じブックマークだった場合に同期をしたらブックマークは重複してしまうのでしょうか? PC1:A,B,C,D,E PC2:A,B,C,D,E を同期したら PC1:AA,BB,CC,DD,EE PC2:AA,BB,CC,DD,EE となりますか?

専門家に質問してみよう