/*
* 本软件为免费、开源软件。
* 本软件的版权(包括源码及二进制发布版本)归一切公众所有。
* 您可以自由使用、传播本软件。
* 您也可以以任何形式、任何目的使用本软件(包括源码及二进制发布版本),而不受任何版权限制。
* =====================
* 作者: 孙明保
* 邮箱: sunmingbao@126.com
*/
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#define ErrQuit(fmt, args...) \
do \
{ \
printf("ErrQuit:%s(%d)-%s:\n"fmt"\n:%s\n", __FILE__,__LINE__,__FUNCTION__,##args, strerror(errno)); \
exit(1);\
} while (0)
void bin2text(int fd_s, int fd_d)
{
char file_data_s[1024];
char file_data_d[sizeof(file_data_s)*3];
int i, read_len, write_len;
while ((read_len=read(fd_s, file_data_s, sizeof(file_data_s)))>0)
{
for (i = 0; i < read_len; i++)
{
sprintf(file_data_d + i*3, "%02hhx ", file_data_s[i]);
}
write_len=write(fd_d, file_data_d, read_len*3);
if (write_len<0)
ErrQuit("write dest file failed");
}
if (read_len<0)
ErrQuit("read src file failed");
}
void text2bin(int fd_s, int fd_d)
{
char file_data_s[1024*3];
char file_data_d[1024];
int i, read_len, write_len;
while ((read_len=read(fd_s, file_data_s, sizeof(file_data_s)))>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=write(fd_d, file_data_d, read_len/3);
if (write_len<0)
ErrQuit("write dest file failed");
}
if (read_len<0)
ErrQuit("read src file failed");
}
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 \n",
argv[0]);
}
}
}
int main(int argc, char *argv[])
{
int fd_s, fd_d;
parse_args(argc, argv);
fd_s = open(src_file, O_RDONLY);
if (fd_s<0)
ErrQuit("open src file failed");
fd_d = open(output_file, O_WRONLY|O_APPEND|O_CREAT
, S_IRUSR | S_IWUSR | S_IRGRP);
if (fd_d<0)
ErrQuit("open dest file failed");
if (memcmp(trans_type,"b2t", 3)==0)
bin2text(fd_s, fd_d);
else
text2bin(fd_s, fd_d);
return 0;
}
二进制文件与16进制(十六进制)文本文件互转工具
原文:http://blog.csdn.net/crazycoder8848/article/details/45646855