前几天写了一篇bin文件合并的文章,提供了一个简洁的程序源码供大家参考。然后在里面也非常简单的谈到了hex文件和bin文件的区别。现在就针对它们的区别想到写一个hex转bin的小程序。当然啦,要写出来这个程序,你必须对他们的区别非常的熟悉,hex的文件格式和内容含义要非常了解。这个网上资料也非常多,很容易搜索得到。本来也打算先讲讲他们具体的区别,以及hex文件的格式内容,再给上程序源码。但感觉这样写下去文章可能就会比较长。这里呢就直接给出源码,大家不知道或者不是很清楚他们之间的区别的话,请自己去搜索,了解。这里提供一个链接给到大家。http://www.360doc.com/content/21/0127/13/99071_959195242.shtml
在清楚的了解它们的区别之后,大家就可以直接看代码,熟悉了代码之后,还可以根据自己的需求去改动源码,接下来就直接上源码吧。
#include<stdio.h>
int getFileLength(char const * filename)
{
FILE * fp = NULL;
int length = 0;
fp = fopen(filename,"r");
if(fp == NULL){
printf("open error");
return -1;
}
fseek(fp,0,SEEK_END);
length = ftell(fp);
fclose(fp);
return length;
}
int getCodeData(unsigned char *dest,unsigned char *src)
{
int i = 0;
int length = ((src[1]-'0')*16+(src[2]-'0'))*2;
if(src[7] == 0x30 && src[8] == 0x30){
for(i=0; i<length; i++){
dest[i] = src[i+9];
}
return length;
}
return 0;
}
void main(void)
{
FILE *fp_hex = NULL;
FILE *fp_hextobin = NULL;
unsigned char file_data[100*1024];
unsigned char temp[100*1024];
int count_1 = 0;
int count_2 = 0;
int a,b;
int ret = 0;
int i = 0;
int file_size = getFileLength("app.hex");
fp_hex = fopen("app.hex","r");
if(fp_hex == NULL){
printf("open error");
return;
}
ret = fread(file_data,1,file_size,fp_hex);
if(ret != file_size){
printf("ret:%d file_size:%d",ret,file_size);
}
fclose(fp_hex);
for(i=0; i<file_size; i++){
/*获取到符号:(行开头)*/
if(file_data[i] == 0x3A){
/*收到文件结束符,退出循环*/
if(file_data[i+8] == 0x31){
break;
}
count_2 = getCodeData(temp+count_1,file_data+i);
count_1 += count_2;
}
}
for(i=0; i<count_1; i+=2){
if(temp[i] > 0x39){//A-F
a = temp[i] - 0x37;
}else{//0-9
a = temp[i] - 0x30;
}
if(temp[i+1] > 0x39){//A-F
b = temp[i+1] - 0x37;
}else{//0-9
b = temp[i+1] - 0x30;
}
file_data[i/2] = a*16 + b;
}
fp_hextobin = fopen("myapp.bin","wb");//不使用“wb”模式的话会在window环境下0x0a前自动加0x0d
if(fp_hextobin == NULL){
printf("open error");
return;
}
ret = fwrite(file_data,1,count_1/2,fp_hextobin);
if(ret != count_1/2){
printf("write error");
return;
}
fclose(fp_hextobin);
}