Neoteny

Byte Ordering

2008. 7. 18. 11:13
반응형

[ 호스트 바이트 순서 (Host Byte Ordering) ]


시스템이 내부적으로 데이터를 처리하는데 있어서 Big-Endian 방식을 쓰느냐, Little-Endian 방식을 쓰느냐는 시스템의 CPU에 따라 달라진다. Motorola 68000 계열이 주로 Big-Endian 방식을 쓰고 있고, 가장 많이 사용되는 Inter X86 계열은 Little-Endian 방식을 쓰고 있다.

  (PowerPC, Sparc : Big,         Intel : Littel,           MIPS : 조정가능)
0x12345678이라는 32비트 값을 표현했을 떄,


Big-Endian    : 0x12 0x34 0x56 0x78

Little-Endian  : 0x78 0x56 0x34 0x12


Little-Endian 방식을 이용하는 컴퓨터는 데이터의 최하위 바이트의 내용을 데이터가 저장될 메모리 공간의 시작주소에 저장한다. 가령, 100.101.102.103과 같은 인터넷 주소에 103에 해당되는 내용이 메모리 공간의 시작 주소에 저장된다.

Big-Endian 바이트 순서 방식을 이용하는 컴퓨터는 데이터의 최상위 바이트에 해당되는 내용을 데이터가 저장될 메모리 공간의 시작주소에 저장한다. 가령, 100.101.102.103과 같은 인터넷 주소는 100에 해당되는 내용이 메모리 공간의 시작주소에 적재가 된다.


[ 네트워크 바이트 순서 (Network Byte Ordering) ]

일반적인 표준 네트워크 바이트 순서는 Big-Endian 방식을 따른다.

시스템에 따른 호스트의 바이트 순서가 틀리기 때문에 소켓 API는 호스트 바이트 순서(Big-Endian, Little-Endian)를 네트워크 바이트 순서(Big-Endian)로 변환시키는 유틸리티와 그 반대의 함수를 제공한다. 만일, 호스트 바이트 순서와 네트워크 바이트 순서가 같다면 바이트 순서 변환 유틸리티는 아무 일도 하지 않을 것이다.



</usr/include/netinet/in.h>


# if __BYTE_ORDER == __BIG_ENDIAN
/* The host byte order is the same as network byte order,
   so these functions are all just identity.  */
# define ntohl(x) (x)
# define ntohs(x) (x)
# define htonl(x) (x)
# define htons(x) (x)
# else
#  if __BYTE_ORDER == __LITTLE_ENDIAN
#   define ntohl(x) __bswap_32 (x)
#   define ntohs(x) __bswap_16 (x)
#   define htonl(x) __bswap_32 (x)
#   define htons(x) __bswap_16 (x)
#  endif
# endif
#endif

반응형