2013-06-26 1 views
1

다음은 Linux OS의 파일에 intchar array을 쓰는 예제 C 코드입니다. fwrite로 이진 파일에 int 값 쓰기

int main(void){ 
    struct eg{ 
     int x; 
     char y[3]; 
    }; 

    struct eg example_array[5] = {{ 0, {0}}}; 

    int i; 
    for(i=0;i<3;i++){ 
     example_array[i].x = i; 
     strcpy(example_array[i].y,"12"); 
    } 

    FILE *fp; 
    fp = fopen("/home/ubuntu/example", "wb"); 
    fwrite(&example_array, sizeof(struct eg), 5, fp); 
    fclose(fp); 

return 0; 
} 

nano example

^@^@^@^@12^@^@^A^@^@^@12^@^@^B^@^@^@12^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@

hexedit example 등의 내용을 표시하는 것은

00000000 00 00 00 00 31 32 00 00 01 00 00 00 31 32 00 00 02 00 00 00 31 32 00 00 00 00 00 00 ....12......12......12...... 
0000001C 00 00 00 00 00 00 00 00 00 00 00 00              ............ 

으로 내가 이진 파일에 example_array[i].x 값이 표시되지 않는 그것을 보여줍니다. 누구든지 위의 코드에서 fwrite을 어떻게 사용해야했는지 알 수 있습니까?

^@^@^@^@^@......은 무엇을 나타 냅니까? 공백입니까?

+2

어떤 아키텍처를 사용하고 있습니까? x86이 리틀 엔디안이라는 것을 알고 있습니까? –

+0

예 x86에 있지만 armv4l 아키텍처에서 코드를 컴파일합니다. – sven

답변

2

^X은 인쇄 할 수없는 ASCII 값이있는 바이트를 인코딩합니다. ^@0, ^A1, ^B2을 의미합니다.

int ch[] padding 
-------- ---- ------- 
^@^@^@^@ 12^@ ^@ 
^A^@^@^@ 12^@ ^@ 
^B^@^@^@ 12^@ ^@ 
^@^@^@^@ ^@^@ ^@ 
^@^@^@^@ ^@^@ ^@ 
^@^@ 

컴퓨터는 최하위 바이트로 시작하는 데이터를 저장합니다. 처음 네 개의 열은 int을 나타냅니다. 그 다음 세 개는 char[3]입니다. 마지막으로 struct 사이에는 1 바이트의 패딩이 있습니다.

1

^@^A이 0x01을 나타내고, ^B이 0x02를 나타내는 등 이진 0x00을 나타냅니다. 당신이 게시 한 헥스 덤프를보십시오. 플랫폼에 따라 sizeof (int)가 4 인 경우 example_array[i].x 각각에 대해 4 바이트를 찾은 다음 문자열이 y 인 세 개의 바이트가 더 있습니다. 첫 번째 x00 00 00 00, 두 번째 문자는 01 00 00 00이고 두 번째는 시스템에 정수가 저장되는 방식입니다. 값을 문자열로 쓰고 싶다면, 예를 들어. 플랫폼 독립적 인 출력 파일을 갖기 위해 다음과 같은 것을 사용할 수 있습니다.

fprintf(fp, "%d %s ", example_array[i].x, example_array[i].y)