2014-10-29 3 views
-1

У меня есть .hex-файл, и я хочу изменить некоторые конкретные позиции этого файла с другими шестнадцатеричными значениями.char * string to hex Значение uint8_t для изменения файла .hex

Я хранятся данные, которые я хочу использовать для изменения файла в uint8_t *linedata[2];

конкретнее в linedata[1]. Если я использую:

printf("%s\n", linedata[1]); 

Выход:

11f3efcc2898ce4c3a0287acb774d90b

Я получаю строку, я хочу, но мне это нужно в формате 00 к FF, поэтому я использую uint8_t *value для таких назначение следующим образом:

for (j = 0; j < n; j++) 
    sscanf(linedata[1] + (j * 2),"%02x", &value[j]); 

for (j = 0; j < n; j++) 
    printf("%02x\n", (unsigned int)value[j]); 

Но теперь результат плохого в первых двух гравюр:

00 00 эф куб.см 28 98 в.п. 4с 3a 02 87 переменного тока b7 74 d9 0b

Кроме того, я не могу изменить хорошо hex файл, я пытаюсь использовать fseek, чтобы установить указатель в позицию, которую я хочу записать, но как узнать позицию памяти, где я должен писать? Поскольку он, похоже, не совпадает с количеством символов, может быть умножен на каждый символ, на размер гексагона в памяти?

Я собираюсь отправить весь код здесь:

#include <stdlib.h> 
#include <stdio.h> 
#include <stdint.h> 
#include <string.h> 

const int NUMBER = 2; 

nt main(int argc, unsigned char * argv[]) 
{ 
    int j=0; 
    uint8_t *linedata[2]; 
    uint8_t *arraykey=malloc(sizeof(uint8_t)*16); 
    //uint8_t *arraykey=linedata[1]; 
    uint8_t *pos; 
    uint8_t *value; 
    unsigned char *valor; 
    size_t i,n; 
    value = malloc(sizeof(value)); 

    char ch; 
    int check; 
    char *hexsource="ble_app_beacon.hex"; 
    char *hextarget; 
    char *hextag=".hex"; 
    int cont=1; 
    int stringindex=0; 
    uint8_t dataarray[16]; 
    int count=0; 
    int w=0; 

    uint8_t prueba[16]={0x52,0x87,0x1D,0x6B,0x9D,0x60,0x00,0x46,0xD7,0x20,0xD4,0x73,0x90,0xEE,0x42,0xBC}; 

    FILE *ptr_file, *source, *target;; 

    char buf[40]; 

    ptr_file =fopen("comercekeyfile","r"); 
    if (!ptr_file) 
     return 1; 

    while (fgets(buf,sizeof(buf), ptr_file)!=NULL) 
    { 
     char *dbuff=strdup(buf); 
     linedata[n]=strtok(dbuff, ":"); 
     n++; 
     linedata[n]=strtok(NULL,":"); 

     printf("%s\n",linedata[0]); //linedata[0] is the commerce id 
     printf("%s\n", linedata[1]); //linedata[1] is the commerce KEY 

     //n = strlen(linedata[1])/2; 
     n=16; 
     source = fopen (hexsource, "r"); 

     if(source == NULL) 
     { 
      printf("Press any key to exit...\n"); 
      exit(EXIT_FAILURE); 
     } 

     //IT'S FAILING HERE FOR SURE 
     hextarget=strcat(linedata[0],hextag); 
     target=fopen (hextarget, "w"); 

     if(target == NULL) 
     { 
      fclose(source); 
      printf("Press any key to exit...\n"); 
      exit(EXIT_FAILURE); 
     } 

     while((ch = fgetc(source)) != EOF) 
     { 
      fputc(ch, target); 
      cont++; 
     } 
     fclose(target); 
     target=fopen (hextarget, "r+"); 
     fseek (target , 11505 , SEEK_SET); 

     if (value == NULL) 
     { 
      perror("malloc"); 
      exit(EXIT_FAILURE); 
     } 

     printf("%s\n",linedata[1]); 

     for (j = 0; j < n; j++) 
      sscanf(linedata[1] + (sizeof(uint8_t))*(j * 2),"%02x", &value[j]); 

     for (j = 0; j < n; j++) 
      printf("%02x\n", (unsigned int)value[j]); 

     free(value); 
     /* 
     check=mkdir(linedata[0],0777); 

     if(!check) 
      printf("Directory created\n"); 
     else 
      printf("Unable to create Directory\n"); 
     */ 

     free(dbuff); 
     n=0; 
     printf("File copied successfully.\n"); 
     cont=1; 
     stringindex=0; 

     fclose(source); 
     fclose(target); 

    } 
    fclose(ptr_file); 
    return 0; 
} 

Любая идея?

Я думаю, что ошибка должна быть, когда я использую hextarget=strcat(linedata[0],hextag); Может быть, попытаться выделить память, которую я мог бы исправить, но я не уверен.

Я ожидаю получить те же данные, напечатанные с использованием linedata[1], но по значению, потому что мне нужен формат 00-FF, чтобы хранить шестнадцатеричный ключ, который я получаю из файла в конкретной ячейке памяти. Например, у меня есть это.шестнадцатеричный файл:

: 1097B00005DA00214042914111A60A4608E00099CD : 1097C00009688B0701D50FA602E0490701D50EA64F : 1097D00001251146009F0024243704E000F0E1F940 : 1097E00030323A55641C02460A43F7D12B463246C2 : 1097F0002146009800F012FAFEBD000000000000B3

И мне нужно, чтобы изменить это и получить:

: 1097B00005DA00214042914111A60A4608E00099CD : 1097C00009688B0701D50FA602E0490701D50EA64F : 1097D00001251146009F0024243704E000F0E1F940 : 1097E00030323A55641C02460A43F7D12B463246C2 : 1097F00021 11f3efcc2898ce4c3a0287acb774d90b

Спасибо вы очень много.

+0

И какой результат вы ожидаете? Как объявляются 'value' и' linedata'? –

+0

... и какова ценность 'n'? Опубликуйте больше кода. –

+0

Здесь описывается формат файла Intel hex, если это то, что вы имеете в виду: http://www.keil.com/support/docs/1584/ –

ответ

1

Что это?

uint8_t *value; 
... 
value = malloc(sizeof(value)); 

Это выделяет память для одного указателя. Позже вы индексировать value[15] с высказываниями

n=16; 
... 
for (j = 0; j < n; j++) 
    printf("%02x\n", (unsigned int)value[j]); 

Но код такой беспорядок, что трудно увидеть, если вы делаете что-то правильно. Например, вы использовали n для двух разных целей и, наконец, сбросили его до 0 в конце вашего цикла while. В качестве статической переменной он будет инициализирован 0, но в цикле вы должны действительно установить его перед использованием, а не после.

+0

' n' не является статической переменной, это * локальная * переменная, и поэтому она будет * не * автоматически инициализироваться с помощью 0. (Если компилятор не делает этого. do, большинство не делают, и абсолютно никто не должен * полагаться * на это.) – usr2564301

+0

Хорошая точка @Jongware. В этом случае 'linedata [n] = strtok (dbuff,": ");' использует uninitialised 'n' –

+0

. Я модифицировал много раз и по-разному код, поэтому он немного беспорядочен. Я попробую инициализировать все хорошо, но когда я печатаю linedata [1], я получаю правильную строку, возможно, мне повезло, но она не терпит неудачу. Если я использую printf с linedata [1] после strcat, когда значение изменяется и терпит неудачу. Отредактировано: Инициализация всех значений результат тот же – Fulgor3