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 의 저장 순서와 상관없이 항상 같은 바이트열이 나온다. 구조체를 통째로 보내는 방식이 위험한 이유가 여기에도 있다.