'TCP/IP'에 해당되는 글 1건

  1. 2007.11.19 리틀 엔디안 (Little-Endian) / 빅 엔디안 (Big-Endian)
원본 http://blog.naver.com/milkclub/60005272811


데이터 저장/전송에서 주의할 바이트 순서 (리틀 엔디안 / 빅 엔디안)

글. 오상문 (sualchi@yahoo.co.kr  /  sualchi@daum.net )

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


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


<이상>


참조 : ‘endian에 대해서, 윤 상배(dreamyun@yahoo.co.kr)’ 등 인터넷 문서 일부



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

다음 코드를 이용하여 여러분의 프로그램이 수행될 시스템의
Endian(바이트정렬) 정보를 알 수 있습니다.
 
int x = 1;
 
if (*(char *)&x == 1) {
  /* Little-Endian */
  /* printf("Little-Endian\n"); */
}
else {
  /* Big-Endian  */
  /* printf("Big-Endian\n"); */
}
 
 
참조 : C Programming FAQs, By Steve Summit, January/1/2001
작업노트/etc. l 2007. 11. 19. 23:36
1 

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

카테고리

분류 전체보기 (117)
작업노트 (98)
거미줄세상 (12)
쌓기 (1)
책읽기 (0)
Reviews (4)

달력

«   2024/05   »
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 31
get rsstistory! Tistory Tistory 가입하기!