У меня есть .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
Спасибо вы очень много.
И какой результат вы ожидаете? Как объявляются 'value' и' linedata'? –
... и какова ценность 'n'? Опубликуйте больше кода. –
Здесь описывается формат файла Intel hex, если это то, что вы имеете в виду: http://www.keil.com/support/docs/1584/ –