⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hex2dual.c

📁 FPGA的51内核(全)
💻 C
字号:
/*****************************************************************************/
/* Program : hex2dual                                                        */
/*                                                                           */
/* Author :  Roland H鰈ler                                                   */
/* Date :    23.08.2001                                                      */
/* Purpose:  Convert Intel HEX files to binary notation text files.          */
/*****************************************************************************/

#include <sys/stat.h>    
#include <stdlib.h>    
#include <limits.h>    
#include <time.h>    
#include <sys/types.h> 
#include <stdio.h> 
#include <string.h> 
#include <unistd.h> 
#include <errno.h> 
 
#define LINE_LENGTH 128
#define FILE_EXT ".dua"

static char *cmnd;

FILE *fpr;
FILE *fpw; 

/*---------------------------------------------------------------------------*/
/*  Function : error_exit                                                    */
/*                                                                           */
/*  Purpose :  Print error message, close files, and exit                    */
/*             program with exit code EXIT_FAILURE.                          */
/*  Input :    Message text                                                  */
/*---------------------------------------------------------------------------*/
void error_exit (char *msg) 
{ 
  (void) fprintf (stderr, "%s: %s: %s\n", cmnd, msg, strerror(errno)); 
/*   (void) fclose(fpr); */
/*   (void) fclose(fpw); */
  (void) fflush(stdout);
  exit (EXIT_FAILURE); 
}

/*---------------------------------------------------------------------------*/
/*  Function : hex2bin                                                       */
/*                                                                           */
/*  Purpose :  Convert a hexadecimal character in its binary representation  */
/*  Input :    Hexadecimal character                                         */
/*---------------------------------------------------------------------------*/
char *hex2bin (char hexval)
{
  /* Default is new line */
  static char bnibble[5] = "----\0";
  /* Convert hexadecimal character */
  if (hexval == '0') (void)strcpy(bnibble,"0000");
  if (hexval == '1') (void)strcpy(bnibble,"0001");
  if (hexval == '2') (void)strcpy(bnibble,"0010");
  if (hexval == '3') (void)strcpy(bnibble,"0011");
  if (hexval == '4') (void)strcpy(bnibble,"0100");
  if (hexval == '5') (void)strcpy(bnibble,"0101");
  if (hexval == '6') (void)strcpy(bnibble,"0110");
  if (hexval == '7') (void)strcpy(bnibble,"0111");
  if (hexval == '8') (void)strcpy(bnibble,"1000");
  if (hexval == '9') (void)strcpy(bnibble,"1001");
  if ((hexval == 'A') || (hexval == 'a')) (void)strcpy(bnibble,"1010");
  if ((hexval == 'B') || (hexval == 'b')) (void)strcpy(bnibble,"1011");
  if ((hexval == 'C') || (hexval == 'c')) (void)strcpy(bnibble,"1100");
  if ((hexval == 'D') || (hexval == 'd')) (void)strcpy(bnibble,"1101");
  if ((hexval == 'E') || (hexval == 'e')) (void)strcpy(bnibble,"1110");
  if ((hexval == 'F') || (hexval == 'f')) (void)strcpy(bnibble,"1111");
  return (bnibble);
} 
 
/*---------------------------------------------------------------------------*/
/*  Function : hex2int                                                       */
/*                                                                           */
/*  Purpose :  Convert a hexadecimal character in its integer representation */
/*  Input :    Hexadecimal character                                         */
/*---------------------------------------------------------------------------*/
int hex2int (char hexval)
{
  /* Default */
  int inibble = 17;
  /* Convert hexadecimal character */
  if (hexval == '0') inibble = 0;
  if (hexval == '1') inibble = 1;
  if (hexval == '2') inibble = 2;
  if (hexval == '3') inibble = 3;
  if (hexval == '4') inibble = 4;
  if (hexval == '5') inibble = 5;
  if (hexval == '6') inibble = 6;
  if (hexval == '7') inibble = 7;
  if (hexval == '8') inibble = 8;
  if (hexval == '9') inibble = 9;
  if ((hexval == 'A') || (hexval == 'a')) inibble = 10;
  if ((hexval == 'B') || (hexval == 'b')) inibble = 11;
  if ((hexval == 'C') || (hexval == 'c')) inibble = 12;
  if ((hexval == 'D') || (hexval == 'd')) inibble = 13;
  if ((hexval == 'E') || (hexval == 'e')) inibble = 14;
  if ((hexval == 'F') || (hexval == 'f')) inibble = 15;
  return (inibble);
}  

/*****************************************************************************/
/*                                                                           */
/*                               MAIN PROGRAM                                */
/*                                                                           */
/*****************************************************************************/
int main (int argc, char **argv) 
{ 
  char line[LINE_LENGTH];
  char nline[LINE_LENGTH*4];
  char *fwname;
  int nmbr = 0;
  int n = 0;
 
  nline[0] = '\0';
  cmnd = argv[0];

  /* Check options and count them */
  if (argc != 2)
    error_exit ("Usage: hex2bin <filename>");

  /* Build file name for new file */ 
  fwname = (char*)malloc(sizeof(argv[2]) + 1);
  if (fwname == NULL)
    error_exit ("Not enough memory");
  fwname[0] = 0;
  (void)strcpy(fwname,argv[1]);
  (void)strcpy(fwname + strlen(fwname) - 4,FILE_EXT);
  fprintf(stderr,"fwname = %s\n",fwname);

  /* Open file */
  if ((fpr = fopen (argv[1],"r")) == NULL)
    error_exit ("Cannot open input file!");
  /* Create file */
  if ((fpw = fopen (fwname,"w")) == NULL)
    error_exit ("Cannot create output file!");

  /* Write converted file */
  while (fgets (line, sizeof(line), fpr) != NULL && strncmp(line,":00000001FF",11) != 0)
    {
      n = 1;
      nmbr = hex2int(line[n]);
      n++;
      nmbr = nmbr*16 + hex2int(line[n]);
      n++;
      n++;
      n++;
      for ( n = 5; n < nmbr+5; n++)
      {
        (void)strcpy(nline,hex2bin(line[2*n-1]));
        (void)strcpy(nline + 4,hex2bin(line[2*n]));
        (void)strcpy(nline + 8 ,"\n");
        fputs (nline,fpw);
        nline[0] = '\0';
      }
    }

  (void) fclose(fpr);
  (void) fclose(fpw);
  
  if (fflush(stdout) == EOF)
    error_exit ("Standard output flush error!");

  return (0);
} 
     

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -