바이트 단위 데이터 파싱과 비트 단위 데이터 파싱에 대해 알아보겠다.
임베디드 개발자는 비트 / 바이트 단위 데이터 파싱에 대해 매우 잘 알고 있어야한다.
하드디스크 데이터시트를 보고 비트 / 바이트단위로 데이터를 가져올 수 있어야 하기 때문이다.
Byte 단위 데이터 파싱
Union
한 union 속 멤버들은 서로 값을 공유한다.
Union을 이용해서 바이트 단위의 파싱을 편리하게 할 수 있다.
참고로 순서가 거꾸로인건 메모리에 리틀엔디안으로 저장되어있기 때문이다.
리틀엔디안에 대한 자세한 설명은 다음 포스팅을 참고 바란다.
[메모리] 빅/리틀 엔디안 (Big/Little-Endian)
빅엔디안 / 리틀엔디안 / Big Endian / Little Endian / 엔디안 / 메모리 저장 순서 / 엔디안의 어원 / 엔디안 유래 / 메모리 저장 방식 / 임베디드 개발자 엔디안(Endian)이란? CPU가 메모리에 값을 저장할때
asdfmelody.tistory.com
Union과 구조체가 합쳐진 모습을 살펴보자.
다음과 같이 Union 내에 첫번째 정의된 형태대로 값을 넣어준다면, 그 형식에 맞춰 다음 멤버에도 동일한 값이 저장된다.
c 변수에는 리틀엔디안이 적용되어 저런식으로 저장되어있다.
Bit 단위 데이터 파싱
하나의 바이트 정보안에 2개의 데이터가 공존할 경우 비트 단위로 파싱해야한다.
이 처럼 1번째 바이트 내에 reserved 데이터와 MSB 데이터가 공존해있다.
이럴때는 비트 단위로 잘라서 데이터를 파싱해주어야한다.
바이트패딩
그런데 컴파일러는 기본적으로 바이트 단위로 데이터를 저장하기 때문에
비트단위로 데이터를 가져올 수 있도록 따로 설정을 해주어야한다.
컴파일러가 바이트 단위로 데이터를 저장하는 것은 바이트 패딩때문이다.
1+4 = 5 인데 8이라고 출력되는 이유는 바이트 패딩때문이다.
CPU 성능을 높이기 위해 패딩이라는 빈 공간을 둔다.
하드웨어 구조상, CPU는 메모리 값을 4바이트(32비트) 단위로 읽을 수 있다.
패딩 미사용시에는 CPU가 두번의 동작으로 변수 b값을 읽어야한다. (느리다)
반면 패딩 사용시에는 CPU가 한번의 동작으로 변수 b값을 읽을 수 있다.
비트 파싱
그치만 우리는 여전히 정보안에 2개의 데이터가 공존할 경우를 대비해서 패딩이 없을 때 비트 파싱하는 방법을 알아보아야한다.
#pragma pack(1)
위와 같은 코드를 적으면, 해당 코드 밑으로 모든 구조체들은 패딩을 사용하지 않는다.
#pragma pack(4) // 원상복구 방법
총 9 bit를 이용한다. 1 byte를 쓰고 1 bit 추가로 더 쓰는 것으로 보면 된다.
따라서 총 2byte 메모리를 사용한다고 볼 수 있다.
union을 이용해서 위와 같이 비트 파싱이 가능하다.
'임베디드' 카테고리의 다른 글
[메모리] 메모리구조 : text data bss stack heap (0) | 2022.04.17 |
---|---|
[시스템] 폰노이만 구조와 캐시메모리 (0) | 2022.04.16 |
[C언어] 문자열 파싱 2 - sscanf sprintf strtok strchar strstr strtol (0) | 2022.04.11 |
[C언어] 문자열 파싱 1 : strlen strcpy strncpy strcat strcmp atoi (0) | 2022.04.10 |
[비트연산] 특정 위치 비트 set / clear / 반전 (0) | 2022.04.09 |