2013-08-02 2 views
0

이진 파일에 대해 더 자세히 배우려고하고 있기 때문에 HexEdit으로 시작했고 수동으로 파일을 작성하고 이에 대한 템플릿을 만들었습니다.C++로 이진 파일을 읽고 그 안에있는 일부 내용을 번역하십시오.

enter image description here

지금, 나는 그 파일의 내용을 읽고 그들을 친화적 보이게하기 위해 C++에서 Win32에서 콘솔 응용 프로그램 작업을 시작 : 여기 내 작품이다. 여기에 일부 내 코드입니다 :

typedef unsigned char BYTE; 

long getFileSize(FILE *file) 
{ 
    long lCurPos, lEndPos; 
    lCurPos = ftell(file); 
    fseek(file, 0, 2); 
    lEndPos = ftell(file); 
    fseek(file, lCurPos, 0); 
    return lEndPos; 
} 

int main() 
{ 
    const char *filePath = "D:\\Applications\\ColorTableApplication\\file.clt"; 
    BYTE *fileBuf;   // Pointer to our buffered data 
    FILE *file = NULL;  // File pointer 

    if ((file = fopen(filePath, "rb")) == NULL) 
     printf_s("Could not open specified file\n"); 
    else { 
     printf_s("File opened successfully\n"); 
     printf_s("Path: %s\n", filePath); 
     printf_s("Size: %d bytes\n\n", getFileSize(file)); 
    } 

    long fileSize = getFileSize(file); 

    fileBuf = new BYTE[fileSize]; 

    fread(fileBuf, fileSize, 1, file); 

    for (int i = 0; i < 100; i++){ 
     printf("%X ", fileBuf[i]); 
    } 

    _getch(); 
    delete[]fileBuf; 
     fclose(file); // Almost forgot this 
    return 0; 
} 

모두의

첫째, 필요 (나는 명확하게 원하기 때문에 내가 그 많은 코드를 제공, 당신은 내가 뭘하려고 오전에 대한 아이디어를 얻을 수 있도록하기 위해) 후 처음 14 바이트를 얻을 텍스트로 콘솔을 작성하고하려면 for에서 나는 각각의 색상이 뭔가를 작성해야합니다 :

black  col_id = 1; R = 00; G = 00; B = 00; 
red  col_id = 2; R = FF; G = 00; B = 00; 
etc... 

가 어떻게 읽고이 바이트를 번역 할 수 있습니다?

+0

같이 할 수있는 읽을 때. 나는 당신의 포맷이 "제정신"이라고 확신하지 않는다고 말해야한다. - 당신은 문자열을 가지고 있는데, 그것은 0을 가지지 않는 것으로 보인다 ("lightgreen"은 내가 볼 수있는 한 10 바이트 필드의 10 바이트를 차지한다) . 형식은 또한 정렬되지 않았습니다 - 그리고 당신은 14 바이트라고 말하지만, 제가 보는 한 13 바이트입니다. –

+0

미안 해요 @MatsPetersson, "처음 14 바이트"는 내 파일의 처음 14 바이트를 뜻합니다 :'ColorTableFile' – Victor

답변

1

14 바이트를 쓰는 것처럼 정확합니다.

기술은 레코드의 레이아웃이있는 구조체를 만든 다음 예를 들어 캐스팅합니다. (C-스타일) 지금

typedef struct 
{ 
    char name[10]; 
    long col_id; 
    unsigned char R; 
    unsigned char G; 
    unsigned char B; 
} rec; 

rec* Record = (rec*)(fileBuf + StartOffsetOfRecords); 

당신이 다음 레코드를 받고 첫 번째 레코드

Record->name, ... 

의 내용을 얻을 수있는 것은 앞으로 당신도 할 수

++Record; 

Record 이동의 문제입니다 헤더의 구조체를 사용하여 레코드 수를 선택하는 것이 편리하도록 잘 정의 된 크기를 얻으려면 stdint.h를 사용하는 것이 좋습니다. 또한 바이트 경계에 구조체를 압축하여 컴파일러에서 패딩을 수행하지 않도록합니다 (예 : #pragma pack(1)).

typedef struct 
{ 
    char signature[14]; 
    uint32_t tableaddress; 
    uint32_t records; 
} header; 

typedef struct 
{ 
    char name[10]; 
    uint32_t col_id; 
    unsigned char R; 
    unsigned char B; 
    unsigned char G; 

} rec; 

그래서 대신에 당신은 당신이 그것은 당신이 도움이 원하는 것을 매우 분명하지 않다이

header Header; 
rec* Record; 

fread(&Header,sizeof(header),1,file); 
fread(fileBuf,1,fileSize,file); 

Record = (rec*)(fileBuf); // first record can be accessed through Record 
+0

Visual Studio에서 작업하고 있습니다. Win32 콘솔 응용 프로그램 프로젝트를 만들었으므로 아직 C 또는 C++을 사용하고 있는지 확실하지 않지만, VS는'cout is undefined','hex is undefined','setw is undefined'라고 말하면서'iostream'을 포함하고 있습니다. – Victor

+0

죄송합니다. 진짜 질문은 다음 기록에 관한 것입니다. 내 답장을 다시 편집했습니다 . –

+0

잠시 후에 다시 시도해 보겠습니다. – Victor

관련 문제