데이터 저장/전송에서 주의할 바이트 순서 (리틀 엔디안 / 빅 엔디안)
글. 오상문 (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)’ 등 인터넷 문서 일부
---------------------------------------------------------------------------
if (*(char *)&x == 1) {
/* printf("Little-Endian\n"); */
else {
'작업노트 > etc.' 카테고리의 다른 글
[펌] 2년차 개발자가 알아야 할 기본 지식 (0) | 2009.01.15 |
---|---|
파이어폭스(firefox)에서의 새로고침 (1) | 2008.12.26 |
[퍼온 글] 서울특별시의회 전자회의시스템 프로젝트 프로그램 개발자 폭행사건 (0) | 2008.10.28 |
호오 쓸만한 녀석 일세 (0) | 2008.06.13 |
SQLinForm - SQL문 정리기 (0) | 2008.03.15 |