임베디드

[C언어] Byte / Bit 단위 데이터 파싱

히똔 2022. 4. 12. 18:49
728x90
반응형

바이트 단위 데이터 파싱과 비트 단위 데이터 파싱에 대해 알아보겠다.

임베디드 개발자는 비트 / 바이트 단위 데이터 파싱에 대해 매우 잘 알고 있어야한다.
하드디스크 데이터시트를 보고 비트 / 바이트단위로 데이터를 가져올 수 있어야 하기 때문이다.

 

Byte 단위 데이터 파싱


 

Union

한 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비트) 단위로 읽을 수 있다.

바이트 패딩 있을때 vs 없을때

패딩 미사용시에는 CPU가 두번의 동작으로 변수 b값을 읽어야한다. (느리다)
반면 패딩 사용시에는 CPU가 한번의 동작으로 변수 b값을 읽을 수 있다.

 

비트 파싱

그치만 우리는 여전히 정보안에 2개의 데이터가 공존할 경우를 대비해서 패딩이 없을 때 비트 파싱하는 방법을 알아보아야한다. 

#pragma pack(1)

위와 같은 코드를 적으면, 해당 코드 밑으로 모든 구조체들은 패딩을 사용하지 않는다.

#pragma pack(4) // 원상복구 방법

 

비트 필드 사용

총 9 bit를 이용한다. 1 byte를 쓰고 1 bit 추가로 더 쓰는 것으로 보면 된다.
따라서 총 2byte 메모리를 사용한다고 볼 수 있다.

비트 파싱

union을 이용해서 위와 같이 비트 파싱이 가능하다.

 

728x90
반응형