임베디드 용어 사전
C 함정

엔디안

여러 바이트 값을 메모리에 늘어놓는 순서. 통신과 저장에서 서로 다른 규칙이 만나면 값이 뒤집힌다.

0x12345678 을 메모리에 어떻게 두느냐의 문제다.

리틀 엔디안   78 56 34 12      ← Cortex-M 기본, x86
빅 엔디안     12 34 56 78      ← 네트워크 바이트 순서

어디서 부딪히나

  • 통신 — 상대 장치나 프로토콜이 빅 엔디안이면 변환이 필요하다
  • 파일·플래시 — 다른 시스템이 읽을 데이터라면 순서를 규격에 못 박아야 한다
  • 캐스팅uint8_t* 로 훑어 재조립하는 코드는 엔디안에 종속된다

안전한 방법

/* 엔디안에 무관한 직렬화 */
buf[0] = (uint8_t)(v >> 24);
buf[1] = (uint8_t)(v >> 16);
buf[2] = (uint8_t)(v >> 8);
buf[3] = (uint8_t)(v);

시프트로 쓰면 CPU 의 저장 순서와 상관없이 항상 같은 바이트열이 나온다. 구조체를 통째로 보내는 방식이 위험한 이유가 여기에도 있다.

함께 보면 좋은 용어

노트에서 맥락과 함께 보기 — 임베디드 C 함정 — 컴파일은 되는데 틀린 것들