바이트 오더(Byte Order)에 대해서...

|

걸리버 여행기에서 소인국 이야기가 나옵니다. 소인국은 그곳에서 2개의 나라로 나누어서 서로 시기하고 싸우고 있다. 소인국 사람들이 계란을 깰 때 큰 쪽(둥근 쪽)을 깨느냐 작은 쪽(뾰족한 쪽)을 깨느냐를 가지고 패가 갈려서 싸웠다죠. 큰 쪽이 big end, 작은 쪽이 little end, 큰 쪽을 깨는 사람들을 big endian, 그 반대쪽을 깨는 사람들을 little endian이라고 부른 것이 엔디안의 기원이라고 합니다.

 컴퓨터에 있는 바이트 오더에 little endian & big endian을 정리해 볼려고 합니다.

(솔직히 저는 little endian만 고려하고 프로그램을 개발했습니다. 즉, Intel CPU만 고려했지요ㅠ,.ㅜ)


  1. Intel 시스템의 경우

  a = 0x1000
   +----------+----------+----------+----------+
   | 00000001 | 00000000 | 00000000 | 00000000 |  a
   +----------+----------+----------+----------+

  *(char *)&a 의 값은 0x1000 번지의 1byte를 읽어들이게 되어서 1의 값이 됩니다.


  2. IBM PC 계열(Power PC)

  a = 0x1000
   +----------+----------+----------+----------+
   | 00000000 | 00000000 | 00000000 | 00000001 |  a
   +----------+----------+----------+----------+

  *(char *)&a 의 값은 0x1000 번지의 1byte를 읽어들이게 되어서 0의 값이 됩니다.


즉, Low level 프로그램을 개발하거나 또는 이 기종 컴퓨터로 네트워크를 통해서 데이타를 보낼때는 미리 알고 있어야 합니다. 미리 알아낸 바이트 오더를 이용해서 다른 기종간의 통신을 할 때에 바이트 오더의 순서를 바꾸어서 보내주어야 합니다.


아래 코드는 컴퓨터에서 바이트 오더를 간단하게 알아내는 방법입니다.


BOOL IsLittleEndian()

{

    BOOL bRet = TRUE;
    int a = 1;

    if( *(char *)&a == 1 )

    {

        bRet = TRUE;

        printf("Little endian.\n");

     }
    else

    {

        bRet = FALSE;

        printf("Big endian.\n");

     }

    return bRet;
}


마지막으로 바이트 오더 순서를 바꾸어 주는 함수를 정리해 보았습니다.

포인터에 관한 내용은 아니지만 바이트 오더의 순서를 바꾸어 주는 함수들이 있습니다.

  • htons(), htonl()

    htons는 Host to network short 의 줄임말입니다. Host 시스템에서 Network로 short 형 데이터를 보낼 때 바이트 오더를 바꾸어주는 함수입니다.

    htonl은 Host to network long 의 줄임말로 long 형 데이터의 바이트 오더를 바꾸어주는 함수입니다.

  • ntohs(), ntohl()

    ntohs는 Network to host short 의 줄임말로 Network에서 Host로 short형 데이터의 바이트 오더를 바꾸어주는 함수입니다.

    ntohl은 Network to host long의 줄임말로 long 형 데이터의 바이트 오더를 바꾸어주는 함수입니다.

위의 함수들은 소켓을 통해 다른 기종간에 데이터를 전송하거나 또는 받아들여서 자신의 바이트 오더에 맞게 변환해 줄 때 사용하는 함수입니다.


결론 : 이기종 컴퓨터와 네트워크 통신하기 전에 Little endian 인지 Big endian 인지를 알아내서 서로의 바이트 오더 정보를 교환한 다음에 그 바이트 오더에 맞추어서 데이터를 통신하게 되면 정확한 데이터를 송수신해야 한다.


출처 : 다년간의 프로그램밍 삽질(경험) 및 구글 사마

 from : http://blog.naver.com/process3?Redirect=Log&logNo=20029237790


And