c
1#include <stdio.h> 2#include <stdlib.h> 3#pragma warning(disable: 4996) 4#define ROWREADMAX 256 //一行の読み込み最大文字数 5#define BUFFER 1024 6#define ADDRESSBYTE2 2 7#define ADDRESSBYTE3 3 8#define ADDRESSBYTE4 4 9#define FILE_OPEN_ERR 0x01 //ファイルオープンエラー 10#define FILE_SPECIFIED_ERR 0x02 // ファイル指定エラー 11#define OPT_ERR 0x04 //オプションエラー 12//オプション 13typedef struct { 14 char* infilename; 15 char* outfilename; 16 char input_flag; 17 char output_flag; 18 char help_flag; 19} opts_t; 20//プロトタイプ宣言 21analysis_srecord_change_binary(char readline[], FILE* wfile); 22unsigned char srecord_change_binary(char* ascdata); 23//オプションの解析 24int opts_analisys(int argc, char* argv[], opts_t* opts) { 25 int err = 0; 26 int cnt; 27 FILE* file; 28 for (cnt = 1; cnt < argc; cnt++) { //引数の数ループ 29 if (*argv[cnt] == '/') { //引数の最初の文字が/なら 30 switch (*(argv[cnt] + 1)) { 31 case'r': 32 case'R': 33 if ((file = fopen(opts->infilename, "r")) != NULL) { //ファイルがあれば 34 } 35 else { //ファイルがなければ 36 err |= FILE_OPEN_ERR; 37 } 38 break; 39 case 'i': 40 case 'I': 41 if (*(argv[cnt] + 2) == '=') { //オプションに= があった場合 42 opts->infilename = argv[cnt] + 3; 43 } 44 else { 45 opts->infilename = argv[cnt] + 2; 46 } 47 break; 48 case 'o': 49 case 'O': 50 if (*(argv[cnt] + 2) == '=') { 51 opts->outfilename = argv[cnt] + 3; 52 } 53 else { 54 opts->outfilename = argv[cnt] + 2; 55 } 56 break; 57 case '?': 58 opts->help_flag = 1; 59 break; 60 default: //オプションが無いとき、エラー 61 err |= OPT_ERR; 62 break; 63 } 64 continue;} 65 if (opts->infilename == NULL) { 66 opts->infilename = argv[cnt]; //引数の一つ目のファイル名はインプットファイル 67 } 68 else if (opts->outfilename == NULL) { 69 opts->outfilename = argv[cnt]; //引数の二つ目のファイル名はアウトプットファイル 70 } 71 else { 72 err |= FILE_SPECIFIED_ERR; //ファイル指定エラーのビットを立てる 73 }}return err;} 74int main(int argc, char* argv[]) { 75 opts_t opts; 76 char readline[BUFFER]; 77 int result = 0; 78 FILE* wfile; 79 FILE* file; 80 //構造体の初期化 81 opts.infilename = NULL; 82 opts.outfilename = NULL; 83 //opts.input_flag = stdin; 84 //opts.output_flag = stdout; 85 opts.help_flag = 0; 86 result = opts_analisys(argc, argv, &opts); //オプションの解析 87 if ((result != 0) || (opts.help_flag)) { 88 if (result & FILE_SPECIFIED_ERR) { 89 fprintf(stderr, "ファイル指定が3つ以上あります\n"); 90 } 91 if (result & FILE_OPEN_ERR ) { 92 fprintf(stderr, "ファイルが存在しません\n"); 93 } 94 if (result & OPT_ERR) { 95 96 fprintf(stderr, "オプションの指定が間違っています\n"); 97 } 98 if ( opts.help_flag) { 99 fprintf(stderr, "Syntax: srec2bin[<opts>] [[/ i[=]]<inpath>] [[/ o[=]]<outpath>] [<opts>]\n"); 100 fprintf(stderr, "Function : converts S record to binary file\n"); 101 fprintf(stderr, "Options :\n\n"); 102 fprintf(stderr, " /r 出力ファイルが存在するとき、強制的に上書きをする。\n"); 103 fprintf(stderr, " /i[=] 入力ファイルパス(デフォルト = stdin)\n"); 104 fprintf(stderr, " /o[=] 出力ファイルパス(デフォルト = stdout)\n"); 105 fprintf(stderr, " /? 使い方の表示\n"); 106 } 107 return;} 108 if (opts.outfilename != NULL) { 109 if ((wfile = fopen(opts.outfilename, "w")) != NULL) { 110 } 111 else { 112 fprintf(stderr, "ファイルが開けませんでした"); 113 return 0;}} 114 else { 115wfile = stdout; 116 } 117 if (opts.infilename != NULL) { //コマンドラインからファイルの入力があれば 118 119 if ((file = fopen(opts.infilename, "r")) != NULL) { //ファイルがあれば 120 } 121 else { //ファイルがなければ 122 fprintf(stderr, "ファイルが開けませんでした"); 123 return 0; 124 } 125 } 126 else { 127 file = stdin; 128 } 129 while (fgets(readline, ROWREADMAX, file) != NULL) { 130 131 analysis_srecord_change_binary(readline, wfile); 132 // puts(readline); 133 } 134 if (opts.infilename != NULL) { 135 fclose(file); //ファイルが開かれたらクローズ 136 } 137 if (opts.outfilename != NULL) { 138 fclose(wfile);} 139} 140//Sレコードを解析しバイナリに変換 141analysis_srecord_change_binary(char readline[], FILE* wfile) { 142 int cnt = 0; 143 char stype; 144 int recsize; //レコード長 145 int addsize; //アドレスの長さ 146 int datasize; //データの長さ 147 unsigned char checksum = 0; 148 static int row = 0; 149 char bindata; 150 row++; //読み込みが何行目か 151 if (readline[cnt] == 'S') { //初めがSなら 152 cnt++; 153stype = (readline[cnt]); //タイプを格納 154 switch (stype) { //タイプによってアドレスの長さ格納 155 case '0': 156 case '1': 157 case '9': 158 addsize = ADDRESSBYTE2; 159 cnt++; 160 break; 161 case'2': 162 case'8': 163 addsize = ADDRESSBYTE3; 164 cnt++; 165 break; 166 case'3': 167 case'7': 168 addsize = ADDRESSBYTE4; 169 cnt++; 170 break; 171 default: 172 fprintf(stderr, "Sレコードではありません"); 173 exit(1);} 174 recsize = srecord_change_binary(&readline[cnt]); //レコードサイズを取得 175 cnt += 2; 176 checksum += recsize; //チェックサムにレコードサイズの部分を足す 177 for (int dcnt = 0; dcnt < addsize; dcnt++) { //アドレスをバイナリに変換してチェックサムに足す 178 bindata = srecord_change_binary(&readline[cnt]); 179 checksum += bindata; 180 cnt += 2; 181 } 182 //レコードサイズから(アドレスサイズ+1(チェックサム))を引き、データサイズを算出 183 datasize = recsize - (addsize + 1); 184 //cnt += addsize; //カウントをアドレス分進める 185 for (int dcnt = 0; dcnt < datasize; dcnt++) { 186 187 bindata = srecord_change_binary(&readline[cnt]); //データをバイナリに変換 188 checksum += bindata; //2バイト進める 189 fputc( bindata, wfile); 190 //printf("%c", bindata); 191 cnt += 2; 192 } 193 checksum += srecord_change_binary(&readline[cnt]); //チェックサムをチェックサムに足す 194 if (checksum != 0xFF) { //チェックサムでデータの確認 195 196 printf("\n"); 197 fprintf(stderr ,"%d行目のデータがおかしいです\n%s",row,readline); 198} 199 } 200 else { 201 fprintf(stderr, "Sレコードではありません"); 202 } 203} 204//Sレコードをバイナリに変換 205unsigned char srecord_change_binary(char *ascdata) { 206 207 unsigned char bin_H; 208 unsigned char bin_L; 209 unsigned char bin_HL; 210 bin_H = (*ascdata - '0'); 211 if (bin_H > 9) { 212 bin_H = bin_H - ('A' - ':'); 213 } 214 bin_H = bin_H << 4; 215 bin_L = (*(ascdata + 1) - '0'); 216 if (bin_L > 9) { 217 bin_L = bin_L - ('A' - ':'); 218 } 219 bin_HL = bin_H |= bin_L; 220 return bin_HL;}
上記のコードで
S0030000FC
S1230000FFD8FFE000104A46494600010101006000600000FFE100664578696600004D4DC8
S1230020002A000000080004011A0005000000010000003E011B00050000000100000046BF
S123004001280003000000010002000001310002000000100000004E00000000000000607B
S12300600000000100000060000000017061696E742E6E657420342E302E3500FFDB004357
S12300800002010102010102020202020202020305030303030306040403050706070707F5
S12300A006070708090B0908080A0807070A0D0A0A0B0C0C0C0C07090E0F0D0C0E0B0C0CF6
S12300C00CFFDB004301020202030303060303060C0807080C0C0C0C0C0C0C0C0C0C0C0C1E
S12300E00C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C7C
.
.
.
.
上記のようなSレコードの jpg txtファイルを読み込むと
リ・ JFIF
・ fExif MM * > F( 1 N
paint.net 4.0.5 ロ C
このような感じで表示されてしまいます。
txtファイルをjpgで読み込むときはどのようにすればよいのでしょうか?
回答2件
あなたの回答
tips
プレビュー