txt文件里面装的是十六进制的数据,而bin文件是二进制,因此我们要把十六进制转为二进制。实现思路就是,以可读的方式打开txt文件,然后以读写打开或建立一个二进制是wb+,打开后,不断的用fgetc读取一个字符,如果遇到空格换行那些继续,如果遇到0~9,还有a~f,需要做转二进制的操作,我定义了一个数组data[2] ,fgetc读到的字符分别放到data[0],data[1]里面去,当i等于二的时候我重新i为0,这样能不断的放到data[0],data[1]里面去,然后再对data[0],data[1]合并转换,转成bin文件所想的进程,我用in来接收,然后再将这个处理的in用fputc放到目标bin下,直到读取完为止就退出
利用ascii码,把字符转为我们真正的数值,然后2个数值合并为一个16进制数值,这样就可以存放了在一个字节的数组里面了。
#include <stdio.h>
#include <stdint.h>
uint32_t i = 0;
uint32_t cnt = 0;
int hexHandler(char *fileSrcName,char *fileDesName)
{
FILE* fpSrc;
FILE* fpDes;
int out, in;
int data[2];
//打开源文件
//FILE *fopen(char *filename, char *mode),如果此文件不能打开,则返回NULL指针。
fpSrc = fopen(fileSrcName, "r");
if (fpSrc ==NULL)
{
printf("%s cannot be open!\n", fileSrcName);
return -1;
}
//以读写打开或建立一个二进制是wb+
fpDes = fopen(fileDesName, "wb+");
if (fpDes == NULL)
{
printf("could not create the binary file: %s\n", fileDesName);
return -1;
}
while (1)
{
//如果到达文件末尾或发生读错误,则返回 EOF int fgetc(FILE *stream)
out = fgetc(fpSrc);
if (out == EOF)
{
if (i == 1)
{
fputc(data[0], fpDes);
cnt++;
}
break;
}
//如果遇到空格、\r、\n这些符号继续
else if (out == ' ' || out == '\n' || out == '\r')
{
continue;
}
//大于0小于9的ascii就减去0,得到的就是阿拉伯数字
else if (out >= '0' && out <= '9')
{
out = out - '0';
}
//A到F,减去A+10,就是十多
else if (out >= 'a' && out <= 'f')
{
out = out - 'a' + 10;
}
else if (out >= 'A' && out <= 'F')
{
out = out - 'A' + 10;
}
else
{
printf("存在其他二进制文件!\n");
fclose(fpDes);
fclose(fpSrc);
return -1;
}
//我定义了个数组data[2],分别把得到的字符放入data[0],data[1]
data[i] = out;
i++;
if (i == 2)
{
i = 0;
//将data[0] data[1]相加进行转换操作
in = (data[0] << 4) + data[1];
//将处理后的数据放进.bin 文件
//int fputc(int char, FILE *stream) 把参数 char 指定的字符(一个无符号字符)写入到指定的流
fputc(in, fpDes);
cnt++;
}
}
fclose(fpDes);
fclose(fpSrc);
}
int main(int argc,char **argv)
{
char *fileSrcName = argv[1];
char *fileDesName = argv[2];
//提示用户用./a.out xxx.txt xxx.bin运行
if(argc <2 ){
printf("please input ./a.out xxx.txt xxx.bin");
}
//封装了一个进制处理函数
hexHandler(fileSrcName,fileDesName);
printf("transform success!\n");
printf("totall %d bytes!\n", cnt);
return 0;
}
目标bin文件,在32位系统上使用hexdump确认结果是否正确
小白写博客,如有不足,望原谅!