文本文件到十六进制

时间:2017-03-31 15:26:16

标签: c

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

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转换为十六进制?提前感谢。

1 个答案:

答案 0 :(得分:0)

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

在内存中表示此文件的逻辑方法是使用两个元素结构的数组:

struct memory_word
{
    uint32_t addr;
    uint32_t value;
};

您可以使用strtoul

从文件的一行解析
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标准的一部分,但应该是。您可以从链接中获取副本。)