hex和bin文件格式的区别Word下载.docx
- 文档编号:21576712
- 上传时间:2023-01-31
- 格式:DOCX
- 页数:15
- 大小:22.68KB
hex和bin文件格式的区别Word下载.docx
《hex和bin文件格式的区别Word下载.docx》由会员分享,可在线阅读,更多相关《hex和bin文件格式的区别Word下载.docx(15页珍藏版)》请在冰豆网上搜索。
冒号是每一条IntelHEX记录的开始
ll是这条记录的长度域,他表示数据(dd)的字节数目.
aaaa是地址域,他表示数据的起始地址
<
如果是数据记录,这表示将要烧录的这条记录中的数据在EPROM中的偏移地址,
对于不支持扩展段地址和扩展线性地址的,如89C51,这就是此条记录的起始地址>
tt这个域表示这条HEX记录的类型,他有可能是下面这几种类型
04----扩展线性地址记录
dd是数据域,表示一个字节的数据,一个记录可能有多个数据字节,字节数目可以
查看ll域的说明
cc是效验和域,表示记录的效验和,计算方法是将本条记录冒号开始的所有字母对
不包括本效验字和冒号>
所表示的十六进制数字
一对字母表示一个十六进制数,这样的一个十六进制数为一个字节>
都加起来然后模除256得到的余数最后求出余数的补码即是本效验字节cc.
例如:
0300000002005E9D
cc=0x01+NOT((0x03+0x00+0x00+0x00+0x02+0x00+0x5E)%0x100)=0x01+0x9C=0x9D
C语言描述:
UCHARcc;
cc=(UCHAR)~(0x03+0x00+0x00+0x00+0x02+0x00+0x5E);
cc++;
>
数据记录
IntelHEX文件由若干个数据记录组成,一个数据记录以一个回车和一个换行结束
回车为0x0d换行为0x0a>
比如下面的一条数据记录
10246200464C5549442050524F46494C4500464C33
10是此行记录数据的字节数目
2462是数据在内存<
将要烧写的eprom地址>
中的起始地址
00是记录类型00(是一个数据记录)
464C到464C是数据
33是此行记录的效验和
扩展线性地址记录(HEX386)
扩展线性地址记录也可称为32位地址记录和HEX386记录,这个纪录包含高16(16-31位)位数据地址,这种扩展的线性记录总是有两个字节数据,像下面这样:
02000004FFFFFC
02是记录的数据字节数目
0000是地址域这在扩展地址记录中总是0000
04是记录类型04(扩展地址记录)
FFFF是高16位地址
FC是记录效验和,计算方法如下:
01h+NOT(02h+00h+00h+04h+FFh+FFh)
当一个扩展线性地址记录被读到后,扩展线性地址记录的数据区域将被保存
并应用到后面从IntelHEX文件中读出的记录,这个扩展线性记录一直有效,
直到读到下一个扩展线性记录.
绝对内存地址=数据记录中的地址+移位后的扩展线性地址
下面举例说明这个过程
从数据记录的地址域得到地址2462
从扩展线性地址记录的地址域得到地址FFFF
绝对内存地址FFFF2462
扩展段地址记录(HEX86)
扩展段地址记录也被称为HEX86记录,包含4-19位的数据地址段,
这个扩展段地址记录总是有两字节数据,如下:
020000021200EA
02是记录中的数据字节数目
0000是地址域,在扩展段地址记录中,这个域总是0000
02是记录类型02(扩展段地址的标示)
1200是该段的地址
EA是效验和
计算如下:
01h+NOT(02h+00h+00h+02h+12h+00h).
当扩展段地址记录被读后,扩展段地址将被存储并应用到以后从IntelHEX文件读出的记录,这个段地址一直有效直到读到下一个扩展段地址记录
绝对内存地址=数据记录中的地址+移位后的扩展段地址
数据记录中的地址域移位后扩展段地址记录中的地址域
从数据记录的地址域得到地址2462
从扩展段地址记录的地址域得到地址1200
绝对内存地址00014462
文件结束记录(EOF)
一个IntelHEX文件必须有一个文件结束记录,这个记录的类型域必须是01,
一个EOF记录总是这样:
00000001FF
00是记录中数据字节的数目
0000这个地址对于EOF记录来说无任何意义
01记录类型是01(文件结束记录标示)
FF是效验和计算如下
01h+NOT(00h+00h+00h+01h).
========================
总结
形如
BBAAAATTHHHH...HHHHCC
BB:
Byte
AAAA:
数据记录的开始地址,高位在前,地位在后
因为这个格式只支持8bits,地址被倍乘
所以,为了得到实际的PIC的地址,需要将地址除以2
TT:
Type
00数据记录
01记录结束
04扩展地址记录(表示32位地址的前缀,当然这种只能在INHX32)
HHHH:
一个字(Word)的数据记录,高Byte在前,低Byte在后
TT之后,总共有BB/2个字的数据
CC:
一个Byte的CheckSum
因为PIC16F873A只有4K的程序空间
所以,不会有TT=04的LinearAddressRecord
hex和bin文件格式
2008年10月23日星期四04:
23P.M.
Hex文件,这里指的是Intel标准的十六进制文件,也就是机器代码的十六进制形式,并且是用一定文件格式的ASCII码来表示.具体格式介绍如下:
Intelhex文件格式
Intelhex文件常用来保存单片机或其他处理器的目标程序代码。
它保存物理程序存储区中的目标代码映象。
一般的编程器都支持这种格式。
Intelhex文件全部由可打印的ASCII字符组成,如下例所示:
2000000012014c75a800e4f508f509780a7a78e4f608dafcd283fcfded240af9a7050dbd81
2000200000010ced2488ec34ff50edc283e4fcfded240af9e76d7013ed33e43c700d0dbd2a
2000400000010ced2488ec34ff50e50509e50970020508e50924a8e50834fd50aee4f50874
Intelhex由一条或多条记录组成,每条记录都由一个冒号“:
”打头,其格式如下:
CCAAAARR...ZZ
其中:
CC
本条记录中的数据字节数
AAAA
本条记录中的数据在存储区中的起始地址
RR
记录类型:
00数据记录(datarecord)
01结束记录(endrecord)
02段记录(paragraphrecord)
03转移地址记录(transferaddressrecord)
...
数据域
ZZ
数据域校验和
校验值:
每一行的最后一个值为此行数据的校验和。
例如:
1000000018F09FE518F09FE518F09FE518F09FE5C0这行中的0xC0
1000100018F09FE5805F20B9F0FF1FE518F09FE51D这行中的0x1D
校验和的算法为:
计算从0x3A以后(不包括0x3A)的所有各字节的和模256的余。
即各字节二进制算术和,不计超过256的溢出值,然后用0x100减去这个算数累加和,得出得值就是此行得校验和。
Intelhex文件记录中的数字都是16进制格式,两个16进制数字代表一个字节。
CC域是数据域中的实际字节数,地址、记录类型和校验和域没有计算在内。
校验和是取记录中从数据字节计数域(CC)到数据域(...)最后一个字节的所有字节总和的2的补码。
而Bin文件是最纯粹的二进制机器代码,没有格式,或者说是"
顺序格式"
按assemblycode顺序翻译成binarymachinecode.由于分析出来Hex文件中的数据域ASCII码表示的十六进制与二进制一一对应,而且我公司DSP又是16位的,以一个word为最小单位,所以四个十六进制ASCII码代表一条机器指令单位或者地址.借于上面分析,编写了工具代码.大体原理是用fscanf函数在每行的数据域读入四个ASCII码,以短整形(shortint16bit)形式储存,在把这个短整形变量顺序fwrite到文件流中去即可.
举一例说明:
表1
ORG0000H
LJMPSTART
ORG040H
START:
MOVSP,#5FH;
设堆栈
LOOP:
NOP
LJMPLOOP;
循环
END;
结束
表2
03000000020040BB
0700400075815F000200431F
表3
020040FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFF75815F00020043
表1为源程序,表2是汇编后得到的HEX文件,表3是由HEX文件转换成的目标文件,也就是最终写入EPROM的文件,它由编程器转换得到,也可以由HEXBIN一类的程序转换得到。
学过手工汇编者应当不难找出表3与表1的一一对应关系,值得注意的是从020040后开始的一长串‘FF’,直到7581,这是由于伪指令:
ORG040H造成的结果。
copyfrom:
/*
使用方法:
bin2hex-badressfilename
-b:
指示hex文件起始地址
address:
hex文件的起始地址(FIXME:
当前版本只支持k字节边界)
filename:
待转换的文件名
示例:
bin2hex-b32krom.bin
*/
#include<
stdio.h>
stdlib.h>
string.h>
FILE*fp_read;
/*待读取文件句柄*/
FILE*fp_write;
/*待写入文件句柄*/
unsignedlongstart_adr;
/*转换成Hex格式的起始地址*/
unsignedshortcur_base;
/*转换成Hex格式的当前地址高16位*/
unsignedshortcur_offset;
/*转换成Hex格式的当前地址低16位*/
unsignedcharread_buf[16];
unsignedcharwrite_buf[48];
void
calc_start_adr(char*buf)
{
unsignedintlen;
len=strlen(buf);
if((buf[len-1]!
='
k'
)&
&
(buf[len-1]!
K'
)){
printf("
Invalidargument.\n"
);
exit(-1);
}
buf[len-1]=0;
start_adr=atoi(buf);
start_adr=start_adr*1024;
cur_base=start_adr>
16;
cur_offset=(unsignedshort)start_adr;
}
start_convert(void)
unsignedcharcnt;
unsignedcharread_num;
unsignedcharcksum,highc,lowc;
/*设置当前地址高16位*/
highc=cur_base>
8;
lowc=(unsignedchar)cur_base;
cksum=2+4+highc+lowc;
cksum=0xFF-cksum;
cksum=cksum+1;
sprintf(write_buf,"
02000004%04x%02x"
cur_base,cksum);
write_buf[15]=0x0D;
write_buf[16]=0x0A;
fwrite(write_buf,1,17,fp_write);
read_num=fread(read_buf,1,16,fp_read);
while(read_num==16){
/*写入读取的16字节*/
highc=cur_offset>
lowc=(unsignedchar)cur_offset;
cksum=0x10+highc+lowc;
for(cnt=0;
cnt<
16;
cnt++){
cksum+=read_buf[cnt];
}
10%02x%02x00%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x"
highc,lowc,
read_buf[0],read_buf[1],read_buf[2],read_buf[3],
read_buf[4],read_buf[5],read_buf[6],read_buf[7],
read_buf[8],read_buf[9],read_buf[10],read_buf[11],
read_buf[12],read_buf[13],read_buf[14],read_buf[15],
cksum);
write_buf[43]=0x0D;
write_buf[44]=0x0A;
fwrite(write_buf,1,45,fp_write);
/*计算当前地址低16位,当越限时写入当前地址高16位*/
if(cur_offset==65520){
cur_offset=0;
cur_base++;
}else{
cur_offset+=16;
read_num=fread(read_buf,1,16,fp_read);
/*写入剩余的字节*/
if(read_num){
cksum=read_num+highc+lowc;
read_num;
%02x%02x%02x00"
read_num,highc,lowc);
sprintf(&
write_buf[9+cnt*2],"
%02x"
read_buf[cnt]);
cksum);
write_buf[11+read_num*2]=0x0D;
write_buf[12+read_num*2]=0x0A;
fwrite(write_buf,1,13+read_num*2,fp_write);
/*写入终止序列*/
00000001FF"
write_buf[11]=0x0D;
write_buf[12]=0x0A;
fwrite(write_buf,1,13,fp_write);
int
main(intargc,char*argv[])
{
if(argc!
=4){
Usage:
%s-baddressfilename.xxx\n"
argv[0]);
-b:
indicatethestartingaddressconvertto.\n"
address:
startingaddress.\n"
filename.xxx:
filetobeconverted.\n"
output:
filename.hex\n"
example:
%s-b64krom.bin\n"
return-1;
if(strcmp(argv[1],"
-b"
};
fp_read=fopen(argv[3],"
rb"
if(fp_read==NULL){
Can'
topenfile%s"
argv[3]);
fp_write=fopen("
rom.hex"
"
w"
if(fp_write==NULL){
tcreatefilerom.hex"
calc_start_adr(argv[2]);
start_convert();
fclose(fp_read);
fclose(fp_write);
printf("
ConvertSeccessfully!
\n"
return0;
}
简单介绍一下这2种文件格式的区别:
1-HEX文件是包括地址信息的,而BIN文件格式只包括了数据本身
在烧写或下载HEX文件的时候,一般都不需要用户指定地址,因为HEX文件内部的信息已经包括了地址。
而烧写BIN
文件的时候,用户是一定需要指定地址信息的。
3-BIN文件格式
对二进制文件而言,其实没有”格式”。
文件只是包括了纯粹的二进制数据。
4-HEX文件格式
HEX文件都是由记录(RECORD)组成的。
在HEX文件里面,每一行代表一个记录。
记录的基本格式为:
+---------------------------------------------------------------+
|RECORD|RECLEN|LOAD|RECTYPE|INFOorDATA|CHKSUM|
|MARK'
'
||OFFSET
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- hex bin 文件格式 区别