バイナリ・ファイルと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;
}