2014-10-01 195 views
1

我想從文本文件中讀取十六進制值。然後我需要存儲它們各自的4位二進制等值,這樣我可以訪問各個位進行比較。 在文件中的十六進制的格式如下:從文件中讀取十六進制

5104 
de61 
567f 

而且我希望能夠有一次存儲一個二進制以這樣的方式每行,我可以訪問特定位,也許在數組?像: {0,1,1,0,0,0,0,1 ...}

我在理解ç模糊的嘗試已經取得了這一點:

int main(int argc, char *argv[]){ 
    FILE *file; 
    char instructions[8]; 
    file = fopen(argv[1], "r"); 
    while(fgets(instructions, sizeof(instructions), file) != NULL){ 
     unsigned char a[8]; 
     int i = 0; 
     while (instructions[i] != '\n'){ 
      int b; 
      sscanf(&instructions[i], "%2x", &b); 
      a[i] = b; 
      i += 2; 
     } 
    } 
    fclose(file); 
    return 0; 
} 
+2

**發表你試過什麼**,和你爲什麼認爲它會起作用以及爲什麼它似乎失敗的猜測。 – WhozCraig 2014-10-01 22:16:54

+0

將它們存儲在字節中,並使用按位運算符來檢查位 – 2014-10-01 22:17:20

+0

「我試過了我能想到的所有方法」這很好。請展示您最接近的嘗試,因爲入門級問題的良好嘗試通常足以修復。 – dasblinkenlight 2014-10-01 22:18:16

回答

2

here服用。使用此代碼,您可以按照原樣讀取文件。

#include <stdio.h> 

int main() { 
    FILE *f; 
    unsigned int num[80]; 
    int i=0; 
    int rv; 
    int num_values; 

    f=fopen("test.txt","r"); 
    if (f==NULL){ 
     printf("file doesnt exist?!\n"); 
     return 1; 
    } 

    while (i < 80) { 
     rv = fscanf(f, "%x", &num[i]); 

     if (rv != 1) 
      break; 

     i++; 
    } 
    fclose(f); 
    num_values = i; 

    if (i >= 80) 
    { 
     printf("Warning: Stopped reading input due to input too long.\n"); 
    } 
    else if (rv != EOF) 
    { 
     printf("Warning: Stopped reading input due to bad value.\n"); 
    } 
    else 
    { 
     printf("Reached end of input.\n"); 
    } 

    printf("Successfully read %d values:\n", num_values); 
    for (i = 0; i < num_values; i++) 
    { 
     printf("\t%x\n", num[i]); 
    } 

    return 0; 
} 

現在,如果你想在二進制轉換十六進制,你可以做很多是。檢查一些提供方法的鏈接。

  1. Convert a long hex string in to int array with sscanf
  2. Source Code to Convert Hexadecimal to Binary and Vice Versa
  3. C program for hexadecimal to binary conversion

只是爲了參考,這裏是從第一個鏈接代碼:

const size_t numdigits = strlen(input)/2; 

uint8_t * const output = malloc(numdigits); 

for (size_t i = 0; i != numdigits; ++i) 
{ 
    output[i] = 16 * toInt(input[2*i]) + toInt(intput[2*i+1]); 
} 

unsigned int toInt(char c) 
{ 
    if (c >= '0' && c <= '9') return  c - '0'; 
    if (c >= 'A' && c <= 'F') return 10 + c - 'A'; 
    if (c >= 'a' && c <= 'f') return 10 + c - 'a'; 
    return -1; 
} 
相關問題