-
C언어에서 struct 정의 그대로 이진 데이터로 만들기Programmer/Programming 2017. 1. 13. 15:15
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;
'Programmer > Programming' 카테고리의 다른 글
엑세스 함수(getter/setter)를 올바로 사용하기 (1) 2017.02.13 public, private, const 키워드가 필요한 이유 (1) 2017.02.08 교착상태(deadlock)를 프로세스 상태와 디버거를 사용해서 찾아내기 (1) 2017.01.06 버젼 관리 시스템을 사용하여 문제를 해결하기 (0) 2017.01.06 Common Lisp으로 구현한 트리(Tree)를 중위 순회(In-order Traversal)하는 반복자(Iterator) (0) 2016.05.17 댓글