- 締切済み
テキストデータをバイナリデータに変換したい
テキストファイルに以下のデータがあるとします。 テキストデータの中身、 「 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 とこのようにメモリに格納したいのです。 格納するバイトオーダーはリトルエンディアン方式とします。 以上で、質問を終わりますが、質問が上手くできていないと思いますので、説明に不備があるかもしれません。その時はお手数ですが、連絡下さい。
- みんなの回答 (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)
/* とりあえず、こんな感じで */ #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(); }