【问题标题】:Read contents of a file as hex in C在C中以十六进制读取文件的内容
【发布时间】:2013-09-12 16:23:17
【问题描述】:

我有一个保存为 hex.txt 的十六进制值的文件

9d ff d5 3c 06 7c 0a

现在我需要将其转换为字符数组

unsigned char hex[] = {0x9d,0xff,0xd5,0x3c,0x06,0x7c,0x0a}

我该怎么做?

【问题讨论】:

    标签: c hex file-handling


    【解决方案1】:

    执行 2 遍历文件。
    1 扫描并计算所需的字节数。
    2 分配所需的内存,然后重复扫描,这次保存结果。

    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;
     }
    

    【讨论】:

      【解决方案2】:

      这段代码完成了工作!!!,但需要我们初始化要转换的十六进制的大小#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");
      }
      

      【讨论】:

        【解决方案3】:

        我可以提供这样的代码。添加适当的包含。

        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;
        }
        

        【讨论】:

          【解决方案4】:

          使用来自here 的文件读取示例,并使用此代码读取值:

          #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 */
          }
          

          连同使用这个功能:

             int getVal(char c)
             {
                 int rtVal = 0;
          
                 if(c >= '0' && c <= '9')
                 {
                     rtVal = c - '0';
                 }
                 else
                 {
                     rtVal = c - 'a' + 10;
                 }
          
                 return rtVal;
             }
          

          【讨论】:

          • 应该是 while((c = fgetc(f)) != EOF) 否则你最终会读到第一个字符的 1
          猜你喜欢
          • 1970-01-01
          • 2012-04-04
          • 1970-01-01
          • 2020-10-25
          • 2014-03-30
          • 1970-01-01
          • 2015-05-01
          • 2011-10-07
          • 2014-11-09
          相关资源
          最近更新 更多