ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 빅엔디안&리틀엔디안
    개발하면서/etc 2009.04.11 23:29

    컴퓨터에서 어떤 크기의 데이터를 메모리에 저장할 때 바이트 단위로 나누어 저장한다.
    그렇다면 2바이트나 4바이트 크기의 데이터는 어떤 바이트 순서로 저장할까?


    먼저 본론부터 말하면 CPU 유형에 따라 바이트 저장순서가 달라질 수 있다.
    크게 두 가지로 나뉘는 데 그것이 바로 ‘리틀 엔디안’과 ‘빅 엔디안’ 방식이다.

     

    1. 리틀 엔디안 (Little-Endian)


    시작 주소에 하위 바이트부터 기록

    ( Intel 80x86 (IBM-PC),  DEC VAX,  DEC PDP-11 )
    주로 SCO 유닉스나 MS 윈도우가 돌아가는 Intel 프로세서 계열 시스템


    -----------------------------------------------------------------------


    -----------------------------------------------------------------------

     

    2. 빅 엔디안 (Big-Endian)


    시작 주소에 상위 바이트부터 기록
    ( IBM370,  Motorola 68000,  Pyramid )
    상용 UNIX가 주로 돌아가는 RISC 프로세서 계열 시스템


    -----------------------------------------------------------------------


    -----------------------------------------------------------------------

     

    네트웍에서 데이터 전송을 할 때도 이러한 엔디안 방식에 주의해야 한다.
    서로 다른 데이터 저장 방식의 시스템끼리 통신하게 되면 전혀 엉뚱한 값을
    주고받기 때문이다. (저장순서가 서로 반대임)


    네트웍 데이터 통신에서는 네트워크 바이트 순서(network byte order, 빅 엔디안)를
    따르도록 데이터의 바이트 순서를 변경해야 한다.
    (TCP/IP, XNS, SNA 규약은 16비트와 32비트 정수에서 빅 엔디안 방식을 사용함)


    클라이언트측 : 네트워크 바이트 순서(빅 엔디안)로 변경하여 전송한다.
          htonl 같은 함수(host to network)를 이용해서 변경시켜주면 된다.

          data = htonl(data);   // data : 전송할 4바이트 값
          write(client_sockfd, (void *)&data, sizeof(int));


    서버측 : 받은 값(네트웍 바이트 순서(빅 엔디안))을 자신에게 맞게 변환하여 사용한다.
            ntohl 같은 함수(network to host)를 이용해서 변경시켜주면 된다.

            printf("%d\n", ntohl(data));   // data : 전송 받은 4바이트 값
            close(client_sockfd);

    댓글 0

Designed by Tistory.