2013-09-09 2 views
6

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

9d ff d5 3c 06 7c 0a 

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

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

Как я это делаю?

ответ

3

Этот код делает работу !!!, но требует, чтобы инициализировать размер шестнадцатеричном быть преобразованы с #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"); 
} 
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; 
    } 
0

Я могу предложить такой код. Добавить надлежащие включает.

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

Выполнить 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; 
}