달력

042018  이전 다음

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  •  
  •  
  •  
  •  
  •  

컴퓨터에서 어떤 크기의 데이터를 메모리에 저장할 때 바이트 단위로 나누어 저장한다.
그렇다면 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);

Posted by 오산돌구