实现一个小程序,把txt文件里面的十六进制数据读取出来,转成bin文件

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确认结果是否正确

小白写博客,如有不足,望原谅!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值