2017-03-31 83 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標準的一部分,但它應該是。 )