gpt4 book ai didi

char * 字符串转换为十六进制 uint8_t 值以修改 .hex 文件

转载 作者:行者123 更新时间:2023-11-30 19:18:32 24 4
gpt4 key购买 nike

我有一个 .hex 文件,我想用其他十六进制值修改该文件的一些具体位置。

我已将用于修改文件的数据存储在uint8_t *linedata[2];

具体在linedata[1]中。如果我使用:

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

输出:

11f3efcc2898ce4c3a0287acb774d90b

我得到了我想要的字符串,但我需要它的格式为 00FF,所以我使用 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 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 格式来存储我得到的十六进制 key 来自具体内存位置的文件。例如我有这个 .hex 文件:

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

我需要修改它并得到:

:1097B00005DA00214042914111A60A4608E00099CD :1097C00009688B0701D50FA602E0490701D50EA64F :1097D00001251146009F0024243704E000F0E1F940 :1097E00030323A55641C02460A43F7D12B463246C2 :1097F0002111f3efcc2898ce4c3a0287acb774d90b

非常感谢您。

最佳答案

这是什么?

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,但在循环中,您应该在使用之前设置它,而不是之后。

关于char * 字符串转换为十六进制 uint8_t 值以修改 .hex 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26627057/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com