Practice/C & C++

C언어에서 struct 정의 그대로 이진 데이터로 만들기

C의 struct를 이진 데이터로 저장하고 불러오는데 원하는대로 되지 않을 때가 있다.
예를 들어, 2 바이트 이후에 적혀야 하는데 4바이트 뒤에 위치하는 경우이다.


예상한 이진 데이터의 구조:


실제 이진 데이터의 구조 (목표 머신-target machine-을 64 bits로 컴파일한 경우):


이는 데이터 구조체 정렬(data structure alignment) 때문에 발생한다.
데이타 구조체 정렬이란 해당 머신의 읽고 쓰는 단위 크기의 배수로 데이타를 할당하는 것을 말한다.
데이터가 이 배수값보다 작으면 데이터 구조체 패딩(data structure padding)을 해준다.


현대의 컴퓨터는 성능을 높이기 위해서 이런 방식을 기본으로 사용한다.
따라서, 프로그래머가 정확한 이진 데이터를 생성하려면 이 기능을 꺼야 한다.


GCC에서는 __attribute__((packed)) 키워드를 사용하여 가장 작은 데이타를 만든다.
즉, padding이 들어가지 않도록 한다.

typedef struct __attribute__((__packed__)) seg_info_s {
    uint64_t stt;
    uint32_t seq;
    uint64_t dur;
    uint8_t  flags;
    uint64_t offset;
    uint32_t size;
    uint8_t  key_id[16];
    char     path[PATH_MAX+1];
} seg_info_t;


Visual C에서는 #pragma pack(1) 지시어를 사용하여 1 바이트 경계에 정렬하도록 명시한다.

#pragma pack(1)

typedef struct seg_info_s {
    uint64_t stt;
    uint32_t seq;
    uint64_t dur;
    uint8_t  flags;
    uint64_t offset;
    uint32_t size;
    uint8_t  key_id[16];
    char     path[PATH_MAX+1];
} seg_info_t;


저작자 표시 변경 금지
신고

알림

이 블로그는 구글에서 제공한 크롬에 최적화 되어있고, 네이버에서 제공한 나눔글꼴이 적용되어 있습니다.

카운터

Today : 68
Yesterday : 341
Total : 179,320