본격적인 프로그래밍을 하기 전에 알아야 할 것들이 많긴 하다.
사전 지식 중, 이 Endian이라 부르는 byte-order는 알아야 할 항목 중 하나다.
이에 대하여 하나씩 설명을 해 나가도록 하겠다.
Endian이란 하나의 byte를 이어 붙일 때, 데이터의 쌓는 방향을 의미하며, 일반적으로 4 byte를 기준으로 이 Endian을 설명한다.
쉽게 이야기를 하면,
0x12345678이란 데이터가 있다고 가정을 하자.
그럼 이를 byte단위로 쪼개면 데이터는 어떤 방향으로 쌓게 되는가?
에 대한 물음을 답 하는 것이 byte-order, 즉 Endian이다.
Endian의 종류는 big-Endian, little-Endian, Middle-Endian으로 나뉘지만, 일반적으로 big-endian과 little-endian을 비교를 많이 한다. 여기선 필자가 middle-endian은 굉장히 생소하고 사용하는 케이스를 본 적이 없으므로 다루지는 않고, little-endian과 big-endian을 다루도록 하겠다.
16진수인 0x12345678이란 값이 little-endian의 경우 아래의 표와 같이 데이터가 정렬이 된다.
3 | 2 | 1 | 0 |
---|---|---|---|
12 | 34 | 56 | 78 |
숫자도 가장 오른쪽이 단위가 작은 수 인 것처럼, byte또한 가장 작은 단위부터 낮은 index에 위치하는 형태의 표현을 little-endian이라고 한다.
위 little-endian에서 예시했던 16진수 0x12345678을 big-endian으로 표현할 경우, 아래의 표와 같이 된다.
3 | 2 | 1 | 0 |
---|---|---|---|
78 | 56 | 34 | 12 |
다시 바꿔서 보면,
0 | 1 | 2 | 4 |
---|---|---|---|
12 | 34 | 56 | 78 |
즉 가장 큰 단위부터 낮은 index에 위치한다.
일반적으론 크게 신경 쓸 일이 없다. 왜냐하면 대부분의 endian은 little-endian을 채용하여 시스템을 구성하기 때문이다. 하지만 그렇다고 big-endian을 사용하지 않는 것은 아니다. 가장 대표적으로 big-endian을 채용한 시스템은 network이기 때문이다.
네트워크계열의 상단을 개발을 하다 보면 endian을 신경쓰지 않을지도 모르지만, 물리계층 영역부터 개발을 하게 되면, IP계층부터 byte-align convert를 해야 하는 일이 종종 생긴다.
이 뿐만이 아니라, MCU에서도 대부분은 little-endian을 채용을 하고 있지만, 일본계 계열 MCU(구 freescale 현 NXP, Motorolla등) 자체 개발한 코어+MCU에선 big-endian을 채용하는 일이 많다.
다른 little-endian에서 사용했던 코드가 이런 big-endian MCU에서 재활용을 할 때, 문제가 발생하면 이 부분을 의심을 할 수 있으므로, 한번쯤은 짚고 넘어가야 했기에 이렇게 글을 남긴다.