我有.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 00 ef cc 28 98 ce 4c 3a 02 87 ac 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
格式才能存储我从具体内存位置的文件中获取的十六进制密钥。
例如,我有这个.hex文件:
:1097B00005DA00214042914111A60A4608E00099CD :1097C00009688B0701D50FA602E0490701D50EA64F :1097D00001251146009F0024243704E000F0E1F940 :1097E00030323A55641C02460A43F7D12B463246C2 :1097F0002146009800F012FAFEBD000000000000B3
我需要修改它并获取:
:1097B00005DA00214042914111A60A4608E00099CD :1097C00009688B0701D50FA602E0490701D50EA64F :1097D00001251146009F0024243704E000F0E1F940 :1097E00030323A55641C02460A43F7D12B463246C2 :1097F00021的 11f3efcc2898ce4c3a0287acb774d90b
非常感谢你。
答案 0 :(得分: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
用于两个不同的目的,最后在while
循环结束时将其重置为0。作为一个静态变量,它将初始化为0,但在循环中你应该在使用之前设置它,而不是在之后。