본문 바로가기

COM

리틀 엔디언과 빅 엔디언의 차이 (Little-endian, Big-endian)

 

 

 

엔디언이란?

 

 

 

엔디언(Endianness)은 컴퓨터의 메모리와 같은 1차원의 공간에 여러 개의 연속된 대상을 배열하는 방법을 뜻하며, 바이트를 배열하는 방법을 특히 바이트 순서(Byte order)라고 한다.

 

 

 

 

 

 

 

 

엔디언은 보통 큰 단위가 앞에 나오는 빅 엔디언(Big-endian)과 작은 단위가 앞에 나오는 리틀 엔디언(Little-endian)으로 나눌 수 있으며, 두 경우에 속하지 않거나 둘을 모두 지원하는 것을 미들 엔디언(Middle-endian)이라 부르기도 한다.

 

 


 

 

이게 무슨 말이야? 큰 단위? 작은 단위? 빅? 리틀?

 

 

 

백문이 불여일견! 쉽게 그림으로 살펴보자!

 

 

 

만약 내가 갖고 있는 값이 11, 33, 22, 41, 12, 52, 94, 15 라면?

 

 

 

 

빅 엔디언으로 1차원의 공간에 값이 있을 경우

빅 엔디언은 위 그림처럼 자리의 번호가 작은(안에 들은 값이 작다는 것이 아니라) 1번 자리부터 순서대로 11, 33, 22, 41, 12, 52 ... 순으로 값이 들어가는 것을 말한다.

 

- 이러한 빅 엔디언은 주로 UNIX를 사용하는 RISC 프로세서 계열이나 네트워크 프로토콜에서 표준으로 사용하는 바이트 순서

 

 

 

장점

위처럼 빅 엔디언은 사람이 숫자를 읽고 쓰는 방법과 같기 때문에 디버깅 과정에서 메모리의 값을 보기 편하게 해줌으로 소프트웨어의 디버그를 편하게 해주는 경향이 있다. 예를 들어 0x59654148 은 순서대로 59 65 41 48로 읽을 수 있다.

 

 

 

 


 

 

리틀 엔디언으로 1차원의 공간에 값이 있을 경우

리틀 엔디언은 위 그림처럼 자리의 번호가 큰(안에 들은 값이 크다는 것이 아니라) 8번 자리부터 역순으로 11, 33, 22, 41, 12, 52 ... 의 값이 들어가는 것을 말한다.

 

- 이러한 리틀 엔디언은 주로 Intel 프로세서 계열에서 사용하는 바이트 순서

 

 

 

장점

위처럼 리틀 엔디안은 메모리에 저장된 값의 하위 바이트 들만 사용할 때 별도의 계산이 필요 없다는 장점이 있다.

예를 들면, 32비트 숫자로 0x2A라는 값을 리틀 엔디언으로 표현하면 2A 00 00 00 이 된다.

이것은 앞에서부터 한 바이트만 떼어내면 하위 8비트(2A)를 바로 얻을 수 있다는 것이다.

반면에, 빅 엔디언에서는 하위 8비트(2A) 값을 얻으려면 변수 주소에 2바이트 또는 3바이트를 더해줘야 하는 번거로움이 있다.

 

 

 

 


 

 

 

 

리틀-빅 서로 변환을 해줄 때

 

이제 우리는 리틀 엔디언과 빅 엔디언의 개념에 대해서 조금이나마 알았다.

 

 

 

"그래 받은 값을 처음부터 끝까지 뒤집어 주라는 거지..?"

 

 

 

라고 생각할 수 있는데 이것은 아니다. 결론부터 말하자면 약속된 바이트 단위 별로 뒤집어주어야 하는 것이다.

 

정확한 값이 2바이트 짜리인지 3바이트 짜리인지 4바이트 짜리인지··· 에 따라 그 바이트 수에 따라 뒤집어 주어야 한다는 것이다.

 

1바이트는 = 8비트 이다.  (1엄복동 = 17,... 미안하다)

 

바이트 수에 따라 뒤집어 주라는 말은 밑에 그림을 참고해보자.

 

 

 


 

 

 

 

내가 상대로부터 받은 값이 11, 33, 22, 41, 12, 52, 94, 15 이고 16비트마다 한 개의 데이터를 저장한다면

 

상대방은 94, 15, 21, 52, 22, 41, 11, 33의 순서를 의도하고 보냈지만

내가 받은 데이터는 15, 94, 52, 21, 41, 22, 33, 11의 순서인 것이다.

 

따라서 상대가 준 값을 정확히 이해하려면 리틀 빅 변환을 해줘야 한다.

그 방법은 위 그림처럼 2 바이트 씩 끝의 바이트 까지 좌우를 서로 바꿔주면 되는 것이다. 

 

 

 

 

 

내가 상대로부터 받은 값이 11, 33, 22, 41, 12, 52, 94, 15 이고 32비트마다 한 개의 데이터를 저장한다면

상대방은 21, 52, 94, 15, 11, 33, 22, 41 의 순서를 의도하고 보냈지만

내가 받은 데이터는 15, 94, 52, 21, 41, 22, 33, 11의 순서인 것이다.

 

따라서 상대가 준 값을 정확히 이해하려면 리틀 빅 변환을 해줘야 한다.

그 방법은 위 그림처럼 4 바이트 씩 끝의 바이트 까지 앞뒤로 뒤집어 주는 것이다.

 

 

 

 

내가 상대로부터 받은 값이 11, 33, 22, 41, 12, 52, 94, 15 이고 8비트마다 한 개의 데이터를 저장한다면

8비트는 1자리이기 때문에 좌우가 없어 그대로 읽으면 된다.

 

24비트는 3자리이기 때문에 좌, 중, 우 로 나누면 좌와 우를 서로 바꿔주면 된다.

 

 


 

 

결국 빅 엔디언과 리틀 엔디언은 서로 저장방식이 다른 것을 뜻하는 것이다.

 

 

 

따라서, 프로그래밍 과정에서 서로 약속된 데이터들과 통신 장치와 기기들의 특성을 잘 파악하여

리틀->빅, 빅->리틀의 변환 과정을 거쳐 정확한 값을 서로 주고 받을 수 있도록 하는 것이 중요하다.

 

 

 

왜냐하면 적절한 리틀 빅 변환을 해주지 않으면 서로 데이터는 정확히 보내주었음에도 불구하고 아래 그림 처럼 전혀 쓸모없는 값이 오가기 때문이다.

 

 

 

서로 취한 줄 아는 리틀이와 빅이