.HEX文件转换成.BIN文件?? /////急/////(100分)

  • 主题发起人 主题发起人 kuer6983
  • 开始时间 开始时间
K

kuer6983

Unregistered / Unconfirmed
GUEST, unregistred user!
需要将hex格式的文件转换成bin格式的文件...但是我对HEX格式不是很了解...哪位知道该怎么转换么?? 最好能提供源程序...急!!

ps: hex格式的文件是否属于文本文件,,,能不能使用readln,writeln函数??
 
hex,bin的文件类型都应该是file,是这样定义
var fp :file;
都不可以使用readln,writeln的。
你可以直接使用read,write.
另外,你这样转换的用处是什么?
 
hex和bin都是16进制的,还要转换??
bin好像只是在文件的后面加了点尾巴而已吧...
 
hex和bin都可以用16进制写入读出。不知楼主转换的目的在于?什么?
不可以使用readln,writeln
读取,写入这两种文件最好用BlockRead和BlockWrite
 
因为HEX文件里带有长度,地址,校验和等的信息,我不知道对文件读写的时候是不是连非数据信息也一起读写的...而我只需要其中的DATA数据,
试过了用BLOCKREAD和BLOCKWRITE, 但是在单不运行时看了缓存BUFFER的内容发现连着地址一起读了过来,而且读取的时候是一个一个数读的, 没有十六进制两个数一起读...
 
前几天刚刚写了个用来读写和切割bin,bif格式文件的,是用流操作的,感觉很方便啊!
 
function UnpackBits2Chars(BitsBuffer : PByte; BitsBufferSize : Integer; CharsBuffer : PChar; CharsBufferSize : Integer):Integer;
var
BitsIndex, CharsIndex,I : Integer;
Bits : Byte;
begin
FillChar(CharsBuffer^,CharsBufferSize,Ord('0'));
CharsIndex:=0;
for BitsIndex:=1 to BitsBufferSize do
begin
Bits := BitsBuffer^;
for I:=1 to 8 do
begin
if CharsIndex>=CharsBufferSize then
begin
Result := CharsIndex;
Exit;
end;
if (Bits and $80)<>0 then
CharsBuffer^ := '1' else
CharsBuffer^ := '0';
Inc(CharsBuffer);
Inc(CharsIndex);

Bits := Bits shl 1;
end;
Inc(BitsBuffer);
end;
Result := CharsIndex;
end;
 
你说的hex文件是标准的inter hex格式的?
:20XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
这种类型的?
很简单啊,用文本方式读入就可以了,你查一下格式说明,没特殊需要的话直接截取中间的数据段就可以了,开头的类型、地址还有后面的校验位都可以舍弃
 
如果是单片机的文件转换我倒是可以提供一些资料呵呵
数据记录

Intel HEX文件由若干个数据记录组成,一个数据记录以一个回车和一个换行结束<回车为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)
如果知道了这些不知道写个转换程序还难不
 
To:来如风
就是这种格式的..我也试着写了程序,但是判断条件太多,觉得会影响运行速度,是否可以提供源代码参考以下...或者讲解一下具体思路 ??
 
多人接受答案了。
 
后退
顶部