Subversion Repositories ngs

Rev

Blame | Last modification | View Log | Download | RSS feed | ?url?

  1. // addcrc.cpp : Defines the entry point for the console application.
  2. //
  3.  
  4. #include <conio.h>
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. #include <string.h>
  8. #include <windows.h>
  9.  
  10.  
  11.  
  12. unsigned int calc_crc(unsigned char *,unsigned int,unsigned int init_crc=0x0000FFFF);
  13.  
  14.  
  15. int main(int argc, char* argv[])
  16. {
  17.         int retval=0;
  18.        
  19.         unsigned int filesize;
  20.         unsigned char byte;
  21.         unsigned int crc16;
  22.  
  23.         FILE * infile,* outfile;
  24.         infile = NULL;
  25.         outfile = NULL;
  26.  
  27.         char * inname, * outname;
  28.         inname  = NULL;
  29.         outname = NULL;
  30.  
  31.         unsigned char * indata;
  32.         indata = NULL;
  33.  
  34.         int nolen=0;
  35.  
  36.  
  37. //      printf("test crc: %X\n",calc_crc((unsigned char *)"123456789",9) );
  38. //      return 0;
  39.  
  40.  
  41. //      if( (argc>=2)&&(argc<=4) )
  42. //      {
  43. //      }
  44.  
  45.  
  46.         if( argc==2 && strcmp(argv[1],"-n") )
  47.         {
  48.                 inname = argv[1];
  49.                 outname = (char*)malloc( strlen(inname)+5 );
  50.                 strcpy(outname,inname);
  51.                 strcat(outname,".crc");
  52.         }
  53.         else if( argc==3 && strcmp(argv[1],"-n") )
  54.         {
  55.                 inname  = argv[1];
  56.                 outname = (char*)malloc( strlen(argv[2])+1 );
  57.                 strcpy(outname,argv[2]);
  58.         }
  59.         else if( argc==3 && !strcmp(argv[1],"-n") )
  60.         {
  61.                 inname = argv[2];
  62.                 outname = (char*)malloc( strlen(inname)+5 );
  63.                 strcpy(outname,inname);
  64.                 strcat(outname,".crc");
  65.                 nolen=1;
  66.         }
  67.         else if( argc==4 && !strcmp(argv[1],"-n") )
  68.         {
  69.                 inname  = argv[2];
  70.                 outname = (char*)malloc( strlen(argv[3])+1 );
  71.                 strcpy(outname,argv[3]);
  72.                 nolen=1;
  73.         }
  74.         else
  75.         {
  76.                 printf("error in arguments!\nuse: addcrc [-n] <infilename> [outfilename]\n");
  77.                 printf("if -n is used, the length of block won't be added to the beginning\n");
  78.                 retval=-1;
  79.         }
  80.  
  81.  
  82.         if( !retval )
  83.         {
  84.                 infile=fopen(inname,"rb");
  85.                 if( infile==NULL )
  86.                 {
  87.                         printf("cant open %s!\n",inname);
  88.                         retval=-1;
  89.                 }
  90.  
  91.                 outfile=fopen(outname,"wb");
  92.                 if( outfile==NULL )
  93.                 {
  94.                         printf("cant open %s!\n",outname);
  95.                         retval=-1;
  96.                 }
  97.         }
  98.  
  99.  
  100.         if( !retval )
  101.         {
  102.                 // get length of input file
  103.                 fseek(infile,0,SEEK_END);
  104.                 filesize=ftell(infile);
  105.                 fseek(infile,0,SEEK_SET);
  106.         }
  107.  
  108.  
  109.         if( !retval )
  110.         {
  111.                 // write length to the output file
  112.                 if( filesize>0x0000fffc )
  113.                 {
  114.                         printf("file too long: %d bytes\n",filesize);
  115.                         retval=-1;
  116.                 }
  117.         }
  118.  
  119.        
  120.         if( !retval )
  121.         {
  122.                 // write length of packed block to the output file
  123.                 if( !nolen )
  124.                 {
  125.                         byte = (filesize>>8) & 0x000000FF;
  126.                         fwrite(&byte,1,1,outfile); // high byte
  127.                         byte = filesize & 0x000000FF;
  128.                         fwrite(&byte,1,1,outfile); // low byte
  129.                 }
  130.         }
  131.  
  132.         if( !retval )
  133.         {
  134.                 // load file in mem
  135.  
  136.                 indata=(unsigned char*)malloc(filesize);
  137.                 if(!indata)
  138.                 {
  139.                         printf("can't allocate memory for input file!\n");\
  140.                         retval=-1;
  141.                 }
  142.         }
  143.  
  144.         if( !retval )
  145.         {
  146.                 if(filesize!=fread(indata,1,filesize,infile))
  147.                 {
  148.                         printf("can't load input file in mem!\n");
  149.                         retval=-1;
  150.                 }
  151.         }
  152.  
  153.         if( !retval )
  154.         {
  155.                 //save into output file
  156.                 if(filesize!=fwrite(indata,1,filesize,outfile))
  157.                 {
  158.                         printf("can't write to output file from mem!\n");
  159.                         retval=-1;
  160.                 }
  161.         }
  162.  
  163.        
  164.         if( !retval )
  165.         {
  166.                 // calc and write crc
  167.  
  168.                 crc16=0x0000FFFF;
  169.                
  170.                 if( !nolen )
  171.                 {
  172.                         byte = (filesize>>8) & 0x000000FF;
  173.                         crc16 = calc_crc(&byte,1,crc16);
  174.                         byte = filesize & 0x000000FF;
  175.                         crc16 = calc_crc(&byte,1,crc16);
  176.                 }
  177.  
  178.                 crc16 = calc_crc(indata,filesize,crc16);
  179.  
  180.                 printf("crc16_ccitt is 0x%X\n",crc16);
  181.  
  182.                 byte = (crc16>>8) & 0x000000FF;
  183.                 fwrite(&byte,1,1,outfile); // high byte
  184.                 byte = crc16 & 0x000000FF;
  185.                 fwrite(&byte,1,1,outfile); // low byte
  186.         }
  187.  
  188.        
  189.        
  190.         if(indata) free(indata);
  191.  
  192.         if(outfile) fclose(outfile);
  193.         if(infile) fclose(infile);
  194.  
  195.         if(outname) free(outname);
  196.  
  197.         return retval;
  198. }
  199.  
  200.  
  201.  
  202. unsigned int calc_crc(unsigned char * data,unsigned int size,unsigned int init_crc)
  203. {
  204.  
  205.         unsigned int i,ctr,crc;
  206.  
  207.         unsigned char * ptr;
  208.  
  209.         crc = init_crc;
  210.  
  211.         ptr=data;
  212.         ctr=0;
  213.         while( (ctr++) <size)
  214.         {
  215.                 crc ^= (*ptr++) << 8;
  216.                
  217.                 for(i=8;i!=0;i--)
  218.                         crc = (crc&0x00008000) ? ( (crc<<1)^0x1021 ) : (crc<<1);
  219.         }
  220.  
  221.         return crc&0x0000FFFF;
  222. }
  223.