バイナリ・ファイルと16進数(16進数)テキスト・ファイルの相互転送ツール

3307 ワード

/* 
 *       、    。
 *       (            )       。
 *        、     。
 *          、         (            ),         。
 * =====================
 *   :    
 *   : [email protected]
 */


#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 


#define ErrQuit(fmt, args...) \
    do \
    { \
        printf("ErrQuit:%s(%d)-%s:
"fmt"
:%s
", __FILE__,__LINE__,__FUNCTION__,##args, strerror(errno)); \ exit(1);\ } while (0) void bin2text(FILE *fd_s, FILE *fd_d) { unsigned char file_data_s[1024]; char file_data_d[sizeof(file_data_s)*3]; int i, read_len, write_len; while ((read_len=fread(file_data_s, 1, sizeof(file_data_s), fd_s))>0) { for (i = 0; i < read_len; i++) { sprintf(file_data_d + i*3, "%02hhx ", file_data_s[i]); } write_len=fwrite(file_data_d, 1, read_len*3, fd_d); if (write_len<0) ErrQuit("write dest file failed"); } if (read_len<0) ErrQuit("read src file failed"); } void text2bin(FILE *fd_s, FILE *fd_d) { char file_data_s[1024*3]; char file_data_d[1024]; int i, read_len, write_len; int cnt=0, write_cnt=0; while ((read_len=fread(file_data_s, 1, sizeof(file_data_s), fd_s))>0) { cnt+=read_len; assert((read_len%3)==0); for (i = 0; i < read_len; i+=3) { file_data_s[i+2] = 0; file_data_d[i/3]=strtol(file_data_s + i, NULL, 16); } write_len=fwrite(file_data_d, 1, read_len/3, fd_d); if (write_len!=read_len/3) ErrQuit("write dest file failed"); write_cnt+=read_len/3; } if (read_len<0) ErrQuit("read src file failed"); printf("cnt=%d; write_cnt=%d", cnt, write_cnt); } char *src_file; char *output_file; char *trans_type; void parse_args(int argc, char *argv[]) { int opt; while ((opt = getopt(argc, argv, "O:o:S:s:t:T:")) != -1) { switch (opt) { case 's': case 'S': src_file = optarg; break; case 'o': case 'O': output_file = optarg; break; case 't': case 'T': trans_type = optarg; break; default: /* '?' */ printf("Usage: %s
", argv[0]); } } } int main(int argc, char *argv[]) { FILE *fd_s, *fd_d; parse_args(argc, argv); fd_s = fopen(src_file, "rb"); if (fd_s==NULL) ErrQuit("open src file failed"); fd_d = fopen(output_file, "wb"); if (fd_d==NULL) ErrQuit("open dest file failed"); if (memcmp(trans_type,"b2t", 3)==0) bin2text(fd_s, fd_d); else text2bin(fd_s, fd_d); fclose(fd_s); fclose(fd_d); return 0; }