char * string to hex uint8_t value以修改.hex文件

时间:2014-10-29 09:45:59

标签: c string file hex

我有.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 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

非常感谢你。

1 个答案:

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