Read contents of a file as hex in C

前端 未结 4 414
孤独总比滥情好
孤独总比滥情好 2020-12-17 01:38

I have a file with hex values saved as hex.txt which has

9d ff d5 3c 06 7c 0a

Now I need to convert it to a character array as

相关标签:
4条回答
  • 2020-12-17 02:14

    I can offer a code like this. Add proper includes.

    unsigned char * read_file(FILE * file) //Don't forget to free retval after use
    {
       int size = 0;
       unsigned int val;
       int startpos = ftell(file);
       while (fscanf(file, "%x ", &val) == 1)
       {
          ++size;
       }
       unsigned char * retval = (unsigned char *) malloc(size);
       fseek(file, startpos, SEEK_SET); //if the file was not on the beginning when we started
       int pos = 0;
       while (fscanf(file, "%x ", &val) == 1)
       {
          retval[pos++] = (unsigned char) val;
       }
       return retval;
    }
    
    0 讨论(0)
  • 2020-12-17 02:23

    use a file read example like from here and with this code read the values:

    #include <stdio.h>   /* required for file operations */
    #include <conio.h>  /* for clrscr */
    
    FILE *fr;            /* declare the file pointer */
    
    main()
    
    {
       clrscr();
    
       fr = fopen ("elapsed.dta", "rt");  /* open the file for reading */
       /* elapsed.dta is the name of the file */
       /* "rt" means open the file for reading text */
       char c;
       while(c = fgetc(fr)  != EOF)
       {
          int val = getVal(c) * 16 + getVal(fgetc(fr));
          printf("current number - %d\n", val);
       }
       fclose(fr);  /* close the file prior to exiting the routine */
    }
    

    along with using this function:

       int getVal(char c)
       {
           int rtVal = 0;
    
           if(c >= '0' && c <= '9')
           {
               rtVal = c - '0';
           }
           else
           {
               rtVal = c - 'a' + 10;
           }
    
           return rtVal;
       }
    
    0 讨论(0)
  • 2020-12-17 02:25

    Perform 2 passes through the file.
    1 Scan and count the required bytes.
    2 Allocate needed memory, then repeat scan, this time saving the results.

    size_t ReadHexFile(FILE *inf, unsigned char *dest) {
      size_t count = 0;
      int n;
      if (dest == NULL) {
        unsigned char OneByte;
        while ((n = fscanf(inf, "%hhx", &OneByte)) == 1 ) {
          count++;
        }
      }
      else {
        while ((n = fscanf(inf, "%hhx", dest)) == 1 ) {
          dest++;
        }
      }
      if (n != EOF) {
        ;  // handle syntax error
      }
      return count;
    }
    
    #include <stdio.h>
    int main() {
      FILE *inf = fopen("hex.txt", "rt");
      size_t n = ReadHexFile(inf, NULL);
      rewind(inf);
      unsigned char *hex = malloc(n);
      ReadHexFile(inf, hex);
      // do somehting with hex
      fclose(inf);
      free(hex);
      return 0;
     }
    
    0 讨论(0)
  • 2020-12-17 02:26

    This code does the job !!!, but requires us to initialize the size of the hex to be converted with #define FILELEN 15

    #include<stdio.h>
    
    #define FILELEN 15
    
    int ascii_to_hex(char c)
    {
            int num = (int) c;
            if(num < 58 && num > 47)
            {
                    return num - 48; 
            }
            if(num < 103 && num > 96)
            {
                    return num - 87;
            }
            return num;
    }
    
    int main()
    {
            FILE *fp = fopen("sample","r");
            unsigned char c1,c2;
            int i=0;
            unsigned char sum,final_hex[FILELEN/2];
            for(i=0;i<FILELEN/2;i++)
            {
                    c1 = ascii_to_hex(fgetc(fp));
                    c2 = ascii_to_hex(fgetc(fp));
                    sum = c1<<4 | c2;
                    final_hex[i] = sum;
                    printf("%02x ",sum);
            }
            printf("\n");
    }
    
    0 讨论(0)
提交回复
热议问题