본문 바로가기

Reverse Engineering/Reversing 이론 설명

[System] 바이트 순서 (Little Endian과 Big Endian)

  다중 바이트로 이루어진 수를 단일 주소를 가진 하나의 데이터로 다루어야 할 필요가 있을 때 어떠한 바이트 순서로 그 데이터를 배열할 것인지 결정하는 것은 엔디언(Endian)이라 하며, 이때 낮은 주소에 최하위 바이트를 저장하는 방식을 리틀 엔디언(Little Endian)이라고 부르며, 이와는 반대로 낮은 주소에 최상위 바이트를 저장하는 방식을 빅 엔디언(Big Endian)이라고 부른다.

0x12345678
※ 최상위 비트 : 12
※ 최하위 비트 : 78

  Little Endian과 Big Endian의 어원은 동화 [걸리버 여행기]에서 출발한다. 걸리버가 여행하던 소인국은 크게 2개의 파벌로 나뉘고 있었다. 그 기준은 달걀을 처음 깨는 방법, 달걀의 뾰족한 부분을 먼저 깨야한다는 파와 그 반대인 넓은 부분으로 깨야한다는 파로 나뉘었다고 한다.

  즉, 가장 높은 자릿수를 왼쪽에 기입하고 오른쪽 방향으로 낮은 자리를 기록하는 것과 같이 주소의 낮은 주소에 낮은 자릿수를 기록하고, 주소 값이 증가할수록 높은 자릿수를 기록하는 것을 리틀 엔디언(Little Endian)이라 부르며 이는 산술 유닛에서 산술 연산들이 오른쪽에서 왼쪽(메모리가 주소가 낮은 쪽에서 높은 쪽으로)으로 가면서 처리되는 순서와 같기 때문에 프로세서에서 산술 연산의 수행이 더 쉬워지며, 사이즈가 32비트인 정수를 16비트의 정수로 변환할 때처럼 사이즈가 큰 정수를 사이즈가 작은 정수로 변환해야 할 때 특별한 조작을 가하지 않고도 작은 자리의 자릿수를 읽을 수 있다는 장점을 가지고 있다.

  이와 반대로 빅 엔디언(Big Endian)은 정수로 정렬된 큰수에 대한 비교를 메모리의 작은 주소부터 큰 주소 방향으로 읽으면서 바로 비교할 수 있어 더 빨리 할 수 있으며, 모든 정수와 문자열을 같은 순서 방향으로 읽을 수 있다는 장점이 있다.

 
하지만 이러한 서로간의 차이와 장점은 그다지 크지 않으며 따라서 어느 것이 보다 더 좋다고 말하기는 힘들며, 이전 기계들과의 호환성을 고려하여 결정되어지는데, 우리가 주로 사용하는 인텔 계열의 마이크로프로세서에서는 리틀 엔디언(Little Endian) 방식을 따르며 Motorola, Sun, Sparc과 같은 RISC 기계에서는 빅 엔디언(Big Endian)을 사용한다.