设为首页 加入收藏

TOP

bin文件转换为hex文件C语言实现(一)
2015-11-19 23:06:56 来源: 作者: 【 】 浏览:20
Tags:bin 文件 转换 hex 语言 实现

对于嵌入式而言,hex文件可能大家再熟悉不过了,对,我们大学时学习的51单片机编写的代码在keil上编译后就生成了hex文件。那bin文件又是什么意思呢,它又和hex文件的区别在哪?这也不是本文的重点,下面简单的描述下:

最通俗的来讲,hex是带地址的,用下载器下载时,不需要设置偏移地址,它是文件流格式的,都是标准的ASCII码。而bin文件是不带地址的,全部是二进制数据流,打住一下,其实就是我们所谓的机器代码。有兴趣的同学,可以尝试着用反汇编,得到的就是汇编代码了。我所用的开发板S3C2440在ADS1.2上编译形成的代码就是bin格式流,用j-flash打开文件的时候就需要填入偏移地址,三星平台flash偏移地址为0,而stm32平台flash偏移地址就是0x08000000.

本来是应该要描述下hex文件的数据格式,这个就留着下一篇文章来描述,其实百度上也有很多。下一张是hex文件转换为bin文件,刚好和本文相反。说了这么多,下面就直接贴出代码了,有不详细的可以给我留言,同时也欢迎大家喷我。

代码是在VC6.0上面实现的:

首先新建bin2hex.h文件

?

#ifndef BIN2HEX_H
#define BIN2HEX_H
typedef unsigned char uint8_t;
typedef unsigned short uint16_t;
typedef unsigned long uint32_t;
/***********************************
*********************************************
就是每次读写bin文件N个字节,然后再转化为hex格式流,hex格式流长度计算方式
: + 长度 + 地址 + 类型 + N个数据(N >= 0) + 校验
1 + 2	 + 4	+ 2	   + N * 2			 + 2
********************************************************************************/
#define NUMBER_OF_ONE_LINE		0x20
#define	MAX_BUFFER_OF_ONE_LINE	(NUMBER_OF_ONE_LINE * 2 + 11) 
typedef struct {
	uint8_t len;
	uint8_t addr[2];
	uint8_t type;
	uint8_t *data;
} HexFormat;

typedef enum {
	RES_OK = 0,						//操作完成
	RES_BIN_FILE_NOT_EXIST,			//相当于bin文件不存在,包括输入的路径可能存在不正确
	RES_HEX_FILE_PATH_ERROR			//目标文件路径可能输入有误			
} RESULT_STATUS;

RESULT_STATUS BinFile2HexFile(char *src, char *dest);
#endif

?

新建bin2hex.c 文件

?

#include "bin2hex.h"
#include 
  
   
/********************************************************************************
input:
	dest: 为转换后的结果
	p->addr[0]: 高地址
	p->addr[1]: 低地址
	p->type: 记录类型
	p->data: 为bin格式流有效数据指针
	p->len: 为bin格式流有效数据长度
output:
	返回有效数据的长度
********************************************************************************/
uint16_t BinFormatEncode(uint8_t *dest, HexFormat *p)
{
	uint16_t offset = 0;
	uint8_t check = 0, num = 0;		//:(1) + 长度(2) + 地址(4) + 类型(2)
	sprintf(&dest[offset], ":%02X%02X%02X%02X", p->len, p->addr[0], p->addr[1], p->type);
	offset += 9;					//hex格式流数据指针偏移2
	check = p->len + p->addr[0] + p->addr[1] + p->type;	//计算校验和
	while (num < p->len)			//当数据长度不为0,继续在之前的hex格式流添加数据
	{								
		sprintf(&dest[offset], "%02X", p->data[num]);
		check += p->data[num];		//计算校验和
		offset += 2;				//hex格式数据流数据指针偏移2
		num++;						//下一个字符
	}
	check = ~check + 1;				//反码+1
	sprintf(&dest[offset], "%02X", check);
	offset += 2;		
	return offset;					//返回hex格式数据流的长度
}

RESULT_STATUS BinFile2HexFile(char *src, char *dest)
{
	FILE *src_file, *dest_file;
	uint16_t tmp;
	HexFormat gHexFor;
	uint32_t low_addr = 0, hign_addr = 0;
	uint8_t buffer_bin[NUMBER_OF_ONE_LINE], buffer_hex[MAX_BUFFER_OF_ONE_LINE];
	uint32_t src_file_length;
	uint16_t src_file_quotient, cur_file_page = 0;
	uint8_t src_file_remainder;
	src_file = fopen(src, "rb");		//源文件为bin文件,以二进制的形式打开
	if (!src_file)						//这里也是相当于用来检查用户的输入是否准备
	{
		return RES_BIN_FILE_NOT_EXIST;
	}
	dest_file = fopen(dest, "w");		//目的文件为hex文件,以文本的形式打开
	if (!dest_file)						
	{
		return RES_HEX_FILE_PATH_ERROR;
	}
	fseek(src_file, 0, SEEK_END);		//定位到文件末 
	src_file_length = ftell(src_file);
	fseek(src_file, 0, SEEK_SET);		//重新定位到开头,准备开始读取数据
	src_file_quotient = (uint16_t)(src_file
首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C - Monkey and Banana HDU 1069(.. 下一篇C语言函数调用参数压栈的相关问题

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: