2017-03-31 77 views
-1

我有一个包含一个文本文件的十六进制代码文本文件以十六进制

00000000 4f909390 
00000002 5e456783 
00000003 3fe52341 

我需要与my_file.txt上述的十六进制值的嵌入式设备进行编程。 但是,当我读取上述文件并打印它们时,我发现文本中的上述十六进制值完全不同,我知道txt数据已转换为十六进制格式。

void print_file() 
{ 
char source[1000000]; 

FILE *fp = fopen("my_file.txt, "r"); 
UINT32 size = ftell(fp); /* get the size */ 
if(fp != NULL) 
{ 
    while((symbol = getc(fp)) != EOF) 
    { 
     strcat(source, &symbol); 
    } 
    fclose(fp); 
} 
    for (UINT32 i = 0; i < size; i++) 
    printf("%02x", buffer[i]); 
} 

上面的代码显示的十六进制转换的文本格式,并显示我

3030303030303030203466393039333930a303030303030303 
2203565343536373833a3030303030303033203366653532333431. 

这是完整与文本进制转换,我检查了网上。

所需的打印输出应该是

00000000 4f909390 
00000002 5e456783 
00000003 3fe52341 

什么是ASCII转化提前诅咒?谢谢本身,而不是阅读文字的十六进制值的权利。

+0

如果不存在'\ 0','strcat'将会出现问题 –

+0

每行的两个数字都是十六进制的,第一个数字是什么意思? – zwol

+0

尝试'人strtol'。 –

回答

0

这并不完全清楚你想要什么,但我认为你正试图读取一个文本文件,其中包含两列数字,都是十六进制。这表示将被写入外围设备的板载存储器的32位字的数组。我猜测第一列是一个地址,第二列是在该地址写入的值。我不知道你要写入文件中没有列出的地址。

代表存储器中的该文件的逻辑的方法是使用一个两元件结构的数组:使用strtoul

struct memory_word 
{ 
    uint32_t addr; 
    uint32_t value; 
}; 

可以解析从线文件的:

int 
parse_line(struct memory_word *buf, const char *line, 
      const char *fname, size_t lineno) 
{ 
    const char *p; 
    char *endp; 
    unsigned long n; 

    errno = 0; 
    p = line; 
    n = strtoul(p, &endp, 16); 
    if (endp == p || !isspace(*endp) || errno || n > (unsigned long)UINT32_MAX) { 
     fprintf(stderr, "%s:%d: invalid address\n", fname, lineno); 
     return -1; 
    } 
    buf->addr = (uint32_t)n; 

    p = endp; 
    n = strtoul(p, &endp, 16); 
    if (endp == p || !isspace(*endp) || errno || n > (unsigned long)UINT32_MAX) { 
     fprintf(stderr, "%s:%d: invalid value\n", fname, lineno); 
     return -1; 
    } 
    buf->value = (uint32_t)n; 

    p = endp; 
    while (isspace(*p)) p++; 
    if (*p) { 
     fprintf(stderr, "%s:%d: junk after record\n", fname, lineno); 
     return -1; 
    } 
    return 0; 
} 

你可以通过调用一个循环来读取整个文件:

struct memory_word * 
read_memory_file (const char *fname) 
{ 
    struct memory_word *values = 0; 
    void *ovalues; 
    size_t nvalues = 0; 
    size_t avalues = 0; 

    char *linebuf = 0; 
    size_t linesz = 0; 

    FILE *fp = fopen(fname, "rt"); 
    if (!fp) { 
     perror(fname); 
     return 0; 
    } 

    while (getline(&linebuf, &linesz, fp) > 0) { 
     nvalues++; 
     if (nvalues > avalues) { 
      avalues = (avalues == 0) ? 16 : avalues * 2; 
      ovalues = values; 
      values = reallocarray(values, avalues, sizeof(uint32_t)); 
      if (!values) { 
       perror("realloc"); 
       free(ovalues); 
       return 0; 
      } 
     } 
     if (parse_line(&values[nvalues-1], linebuf, fname, nvalues)) { 
      fclose(fp); 
      free(values); 
      return 0; 
     } 
    } 

    if (ferror(fp)) { 
     perror(fname); 
     fclose(fp); 
     free(values); 
     return 0; 
    } 
    fclose(fp); 
    return values; 
} 

reallocarray不是C标准的一部分,但它应该是。 )