电路设计,软件开发,专业项目团队承接电子产品开发!


ISPRO下载型编程器
火爆销售中

RS232/TTL转换器
全IC串口窃电

RS232/TTL转换线
全IC串口窃电

ByteBlasterMV Cable
CPLD/FPGA并口下载线

ByteBlaster II Cable ISPRO下载型编程器
支持S51/AVR/PIC
超级51开发板套件
前卫实用超值

PC/MCU/CPLD
三合一学习套件

全新万年历方案
AVR单片机开发板
 

Min51单片机仿真机
迷你型

ARM7开发板
仅售260元!
 

RS-232/RS-485双向接口电平转换器  

51单片机升级STM32
火爆销售中
MPLAB-ICD2
火爆销售中
LED51开发板
玩具又名图文显示棒

面板模块/开发板
经济危机明智决择

       

GSM MODEM GSM猫

SMS短信模块 工业级/全自动
火爆销售中

大功率数传电台

高速数传电台

您当前位置:电子技术资料 -> 外围驱动 -> 编码算法 ->

祝您阅读愉快!

ISPRO下载型编程器

RS232 TO TTL转换器
↑↑本文相关产品介绍↑↑

Hex2bin转换程序


类别:技术文章
来源:未知
作者:未知
关键字:Hex2bin
加入日期:2010-8-4

//Title: Hex2bin
//Test by Borland C++ 3.1 and Microsoft Visual C++ 1.0
//Author: dock
//中国电子网 www.EC66.com
#include <iostream.h>
#include <iomanip.h>
#include <string.h>
#include <process.h> // for exit()
#include <fstream.h> // for ifstream, ofstream
#define MAXLENTH 77 // 32 bytes valid record in a line
#define hexval(c) ((c) >= '0' && (c) <= '9' ? \
(c) - '0' : \
(c) >= 'A' && (c) <= 'F' ? \
(c) - 'A' + 10 : \
(c) >= 'a' && (c) <= 'f' ? \
(c) - 'a' + 10 : \
-1 )

unsigned char getcode(void); // combine a byte and increase the pointer.

unsigned char linebuff[MAXLENTH],*bufptr;

main(int argc, char* argv[]) // access command-line arguments
{
char fnami[15],fnamo[15]; // fnami = input file name etc
unsigned int Line=0; // Program Counter , Source File line
unsigned char arec,attrib,areclen,temp,checksum;
long offset; // file offset at writting
char ch,validline;
if (argc != 2) // test number of arguments
{
cerr << "USAGE: Hexbin file(.hex)\n";
exit(-1);
}
strcpy(fnami,argv[1]); // get first part of filename from cmd line
strcat(fnami,".hex"); // add the extension to the filename string

strcpy(fnamo,argv[1]); // same for o/p filename
strcat(fnamo,".bin");

ifstream source; // declare input and output streams
ofstream dest;

source.open(fnami,ios::nocreate); // source file must be there
if (!source)
{
cerr << "Cannot open source file " << fnami << " for input\n";
exit(-1);
}
dest.open(fnamo,ios::binary); // dest file will be created if not found
// or cleared/overwritten if found
if (!dest)
{
cerr << "Cannot open destination file " << fnamo << " for output\n";
exit(-1);
}

validline=0;
while (!source.eof()) {
source.get(ch);
if(ch==':')validline=1; // A valid record must be started with :
else if(ch=='\t'){validline=0;Line++;}
else validline=0; // Omit the comment
if(validline){
bufptr=linebuff;
source.get(bufptr,int(MAXLENTH),'\n');
Line++;
//Do the Checksum
checksum=0; temp=1;
do{ *bufptr=hexval(*bufptr);
temp++;
if(temp%2)checksum+= *bufptr + *(bufptr-1)*16;
}while(*++bufptr);
// checksum+=*(bufptr-1);
if(checksum){
cerr<<"Checksum in Line " << Line << " is Error.\n";
exit(2);
}

bufptr=linebuff;
areclen=getcode(); //First 2 bytes are record length
offset=getcode(); //Second 4 bytes are record offset
offset=(offset&0xff)<<8; // Avoid sign extension
offset|=getcode();
attrib=getcode(); //If attrib = 1 then the file end.
if(attrib){ cout<< "Hexbin completed\n"; dest.close(); exit(0); }
dest.seekp(offset);
for(temp=0;temp<areclen;temp++) dest.put(getcode());
}
}

cout << "Warning: unrecognized file end\n";

source.close(); // close both streams
dest.close();
}

unsigned char getcode(){
unsigned char i;
i=*bufptr++;
i=i<<4;
i|=*bufptr++;
return i;
}

填充FF没有实现,其实你只要看得懂,就很容易改。
最笨的办法是把处理HEX的那一段重新拷贝一份,处理两遍,第一遍找到最大的那个offset
及其对应的areclen,两个量相加就是最终BIN文件长度,然后把dest流注入这么多FF即可。
第二遍保留现在的即可。

您可能还会关注的相关技术资料:
暂无

中国电子网
www.EC66.com
QQ:34740080 EMAIL:iloveaoe@163.com
最佳浏览:1024*768
Copyright (C) 2001-2010 EC66.COM All Rights Reserved
Aoe/帝国 制作维护
粤ICP备18061901号