네트워크 프로그래밍 시간에, htonl 이런 함수들을 배울 거에요. 리틀 엔디안 순서면, 빅 엔디안 순서로 바꿔버리는, 뭐 그러한 메소드입니다. 더 정확히 말하면, 이런 변환을 해야 합니다.

 

 

 uint32_t를 리틀 엔디안으로 표현한 것이 ABCD라고 해 봅시다. 이걸 빅 엔디안으로 바꾸면 DCBA입니다. 여러 방법이 있지만, c언어의 공용체를 이용해서 쉽게 처리하는 방법을 배워보도록 하겠습니다.

 

 


 공용체의 멤버들은 같은 메모리 공간을 공유합니다. 구조체는, 멤버들이 같은 메모리 공간을 공유하지 않습니다. 그러면 아래와 같이 선언하면 어떻게 될까요?

 

 

 moo 변수인 t를 할당할 때 메모리에 어떻게 그려지는지 보겠습니다.

 

 

 이렇게 될 겁니다. 중요한 것은 num과 char형 배열인 x는 메모리 공간을 공유한다는 것입니다.

 

 

 Little 엔디안 환경이라 생각해 봅시다. temp 변수를 선언하고, uint32_t tar를 넘겨줍시다. 그러면 tar가 2진수로 8개씩 끊었을 때, ABCD 이렇게 저장이 되어 있다고 해 봅시다. 그러면, temp.num에 tar을 집어넣으면, 아래와 같이 들어갈 겁니다.

 

 

 이것을 Big endian으로 바꾸었다면, ABCD가 되어야 합니다. 메모리에 들어갔을 때 DCBA가 들어가 있었다면, x의 0번째와 3번째, 1번째와 2번째 원소를 바꿔주면 됩니다.

 

 

 temp.x[0]과 temp.x[3]을 바꾸고, temp.x[1]과 temp.x[2]를 바꾸는 swap 함수를 구현하면 됩니다.

 

 

  swap 함수는 간단하게 포인터를 이용하면 만들 수 있습니다.

 

 


 그러면 이 시스템이 Big Endian을 쓰는지 그렇지 않은지 검사하는 방법이 없을까요? htonl(x)와 x가 같은지를 검사하셔도 됩니다. 그런데, 그런 함수 없이도 검사할 수 있는 방법이 있는데요. moo 변수 t를 선언하고, t.num에 0x01020304를 넣습니다.

 

 

 

 만약에 Big 엔디안 방식으로 저장이 되었다면, t.x[0]에는 1이, t.x[1]에는 2가, t.x[2]에는 3이, t.x[3]에는 4가 저장이 되어 있을 겁니다. 이렇게 읽히면 Big 엔디안이라고 하시면 됩니다.

 

 

 반대의 경우, Little 엔디안이라고 하시면 됩니다. 이 둘이 아닌 경우에는 Big도 Little도 아닌 (Middle)이라고 하시면 됩니다.