Хобрук: Ваш путь к мастерству в программировании

Прочитать содержимое файла как шестнадцатеричный в C

У меня есть файл с шестнадцатеричными значениями, сохраненный как hex.txt, который имеет

9d ff d5 3c 06 7c 0a

Теперь мне нужно преобразовать его в массив символов как

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

Как это сделать ?

09.09.2013

Ответы:


1

используйте пример чтения файла, например, из здесь, и с помощью этого кода прочитайте значения:

#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;
   }
09.09.2013
  • Должно быть while((c = fgetc(f)) != EOF), иначе вы всегда будете читать 1 для первого символа 19.07.2021

  • 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");
    }
    
    09.09.2013

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

    4

    Выполните 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;
     }
    
    09.09.2013
    Новые материалы

    Как симулировать серию пенальти на Python с помощью симуляции Монте-Карло, часть 1: генерация функций
    Серия пенальти была огромным испытанием во время чемпионата мира по футболу. Они вызвали много споров в социальных сетях и новостных агентствах. Даже финальный матч турнира решался по..

    AST для разработчиков JavaScript
    TL; DR Эта статья - мое выступление на недавно состоявшейся конференции Stockholm ReactJS Meetup. Вы можете посмотреть слайды здесь..

    5 проектов на Python, которые нужно создать прямо сейчас!
    Добро пожаловать! Python — один из моих любимых языков программирования. Если вы новичок в этом языке, перейдите по ссылке ниже, чтобы узнать о нем больше:

    Dall-E 2: недавние исследования показывают недостатки в искусстве, созданном искусственным интеллектом
    DALL-E 2 — это всеобщее внимание в индустрии искусственного интеллекта. Люди в списке ожидания пытаются заполучить продукт. Что это означает для развития креативной индустрии? О применении ИИ в..

    «Очень простой» эволюционный подход к обучению с подкреплением
    В прошлом семестре я посетил лекцию по обучению с подкреплением (RL) в моем университете. Честно говоря, я присоединился к нему официально, но я редко ходил на лекции, потому что в целом я нахожу..

    Освоение информационного поиска: создание интеллектуальных поисковых систем (глава 1)
    Глава 1. Поиск по ключевым словам: основы информационного поиска Справочная глава: «Оценка моделей поиска информации: подробное руководство по показателям производительности » Глава 1: «Поиск..

    Фишинг — Упаковано и зашифровано
    Будучи старшим ИТ-специалистом в небольшой фирме, я могу делать много разных вещей. Одна из этих вещей: специалист по кибербезопасности. Мне нравится это делать, потому что в настоящее время я..