2012-04-19 2 views
0

그래서 여기에 내가해야 할 일이 있습니다. 132x72의 큰 그림이있는 .txt 파일이 있습니다. 내가해야 할 일은 16 진수 값의 C 배열에 넣는 것입니다.C++ : 132x65 바이너리 파일 구문 분석

상위 8 개 줄의 첫 번째 문자를 잡고 가로로 놓을 방법을 찾아서 16 진수로 변환 할 수 있어야합니다. 그럼 그걸 9 번이나 할 필요가있어.

예 :

00000 
00000 
11111 
01010 
10101 
10101 
01010 
10101 

내가로 전환해야 할 것 :

00101101 
00110010 
00101101 
00110010 
00101101 

이 작업을 수행하는 가장 좋은/간단한 방법은 무엇입니까? 나는 정직하게 어디에서 시작해야할지 모른다.

+0

변형을 이해하지 못합니다. 처음은 어떻게 두 번째 것과 관련이 있습니까? – wallyk

+0

(1)이 아스키 아트 또는 실제 이미지 파일입니까? (2) ASCII 아트의 시계 반대 방향 회전 만 설명하는 것입니까? – user7116

+0

@wallyk 첫 번째 열은 첫 번째 행이되고 두 번째 열은 두 번째 행이됩니다. 나는 그 ascii 예술을 추측한다. 하지만 난 단지 16 비트 값으로 변환 할 수 있도록 그것의 8 비트 부분을 얻을 수 있어야합니다. – LiverpoolFTW

답변

2

0과 1이 문자 (이진 파일 인 경우 처음 변환해야 함)이라고 가정하면 .txt 파일에서 파일을 한 줄씩 배열로 읽습니다. 그런 다음 스트라이드가있는 배열을 인쇄 할 수 있습니다. 이자형. 그래서 첫 인쇄 문자 0, 8, 16, 24 ... 그리고 1, 9, 17, ...과 : 그런

for (i = 0; i < ROWS; i++) { 
    for (j = 0; j < COLS; j++) { 
     printf("%c", chars[i + j * ROWS]); 
    } 
    printf("\n"); 
} 

뭔가.

+0

이것은 혼란이 많았 기 때문에 질문을 잘 설명하지 못했지만 이것이 내가 찾고있는 부분입니다. 고마워. – LiverpoolFTW

+0

그것이 당신을 도왔다 니 기쁘다. 다음 번에 더 나은 질문을 공식화하는 법을 알게 될 것입니다.) –

+0

메모 : C++을 사용하지 않으므로 printf와 가능하면'char *'를'std :: vector'로 대체하십시오. –

0

이것은 흥미로운 형식입니다. 어떤 경우에는 라인을 읽고 배열에 적절하게 값을 추가하십시오.

입력 행 1 : 01101

일부 배열에 해당한다 : image[0][0] = 0, image[1][0] = 1 ...

이 가장 push_back() 방법을 사용하여 std::vector으로 수행 할 수 있습니다 이것은 무슨 뜻입니다.

// If you know the image size already 
unsigned char image[NUM_ROWS][NUM_COLS/8]; // 8 bits per byte 

std::ifstream file("yourfile.txt", std::ifstream::in); 

// Initialize the array to 0 with memset or similar 

// Read the whole file 
int rows = 0; 
int cols = 0; 
while(!file.eof) { 
    std::string line; 

    // Get line by line 
    std::getline(file, line); 

    // Parse each line (probably better in another function) 
    const char* str = line.c_str(); 
    while(str[rows] != '\0') { 
    unsigned val = str[rows] - '0'; // Convert to int 
    unsigned shift = 8 - (rows % 8); // 8 bits per byte - this is tricky big-endian or little endian? 
    image[rows][cols/8] |= val << shift; // Convert to int val and pack it to proper position 
    rows++; 
    } 

    cols++; 
    rows = 0; 
} 

file.close(); 

코드는 테스트되지 않았지만 데이터를 올바르게 읽는 방법에 대한 대략적인 아이디어를 제공해야합니다. 이제 값이있는 형식이 지정된 2 차원 배열이 올바로 구성되었습니다 (이것이 이동을위한 것입니다). 여기에서이 값을 int 값으로 가져 와서 적절하게 변환 할 수 있습니다 (기본 16 변환은 2 진수에서 사소한 것입니다. 즉, 각 바이트는 2 자리의 16 진수입니다)