우리의 컴퓨터 님은 내부적으로 데이타를 처리하는데 있어서 메모리에 데이타를 어떻게 저장하느냐에 따라
두 가지 형태로 분리 됩니다.
Litte Endian 방식과 Big Endian 이 있지요~
< Littel Endian > 방식은...
우리가 많이 쓰는 인텔 계열의 80X86시스템에서 쓰는 방식인데. 데이타가 하위 바이트 부터 메모리에 적재 됩니다.
예를 들어, 16진수 01020304 가 적재 될때는 04030201의 형태가 되지요~
이 방식의 순서를 호스트 오더링 ( Host Ordering ) 이라고 합니다.
< Big Endian > 방식은...
매킨토시 계열의 MC86000 의 계열에서 쓰는 방식이며, 데이타가 상위 바이트 부터 메모리에 적재 됩니다.
그래서 그대로 적재 되겠죠..
이 방식의 순서를 네트워크 오더링 < Network Ordering > 이라고 합니다~
네트워킹을 통해 데이타를 송수신할 때는 올바른 데이타를 받고 싶으면..
시스템에 맞게 바이트 오더링 < Byte Ordering >과정이 필요한 겁니다..
Little Endian 방식의 시스템은 네트워크 오더링 과정을 통해 순서를 바꿔서 전송해야 하고..
Big Endian 방식의 시스템은 같은 바이트 순서를 같기 때문에.. 따로 바꿀 필요가 없죠?
Microsoft Visual C++에서 제공하는 Library 에는 이런 바이트 오더링을 위한 네트워크 함수를 지원합니다~
WS2_32.lib에 있는 htons(), htonl(), ntohs(), ntohl() 이 그것들 입니다~!!
이 함수들의 이름 중 ' n '은 네트워크를 의미하고, ' h' 는 호스트를 의미합니다.
' s '는 short (2바이트) 데이타 타입을 의미하구요, ' l '은 long (4바이트) 데이타 타입을 의미합니다~
그래서, htonl() 같은 경우는.. 호스트가 네트워크로(h to n) 데이터를 전송하기 전에
4바이트( l ) 데이터에 대한 바이트 오더링을 해주는 함수인 겁니다~!
그런데 좀 웃겼던 것은..
htonl() 나 ntohl() 나 그 구현 내용이 똑같다는 겁니다 ㅡㅡ , 생각해 봐도 그렇게 되죠..
앞뒤 순서를 바꿔주는건 서로 같으니까..
그런데 왜 2가지 이름으로 존재 하느냐! 그냥 ByteOrderingl() 이런식으로 해도 될것을..
그건 그저 복잡해진 코딩을 좀더 쉽게 이해하기 위한.. 일종의 가독성 정도의 문제가 그 이유라고 할 수 있겠습니다.
시스템에 따라 쓸수도 있고 안쓸수도 있기 때문에.. 생각가능하지만 가독성 의 이유로 저렇게 써주면 좋겠죠?.
< Byte Ordering 함수 >
unsigned long int ntohl ( unsigned long int x)
{
return (
( ( x & 0x000000ffU ) << 24 ) |
( ( x & 0x0000ff00U ) << 8 ) |
( ( x & 0x00ff0000U ) >> 8 ) |
( ( x & 0xff000000U ) >> 24 ) )
);
}
'프로그램언어' 카테고리의 다른 글
ASCII 문자 코드 (0) | 2012.03.24 |
---|