|
문서번호 |
|
보존기간 |
10년 |
작성일자 |
2015.3.17 |
바이트 정렬
(Byte Sort)
작성자: 김성국
학과: 컴퓨터 공학과
학번: 2011761041
목차
1. 바이트 정렬(Byte sort)이란?
2. 바이트 정렬(Byte sort) 사용 경우
3. 바이트 정렬(Byte sort) 함수
4. 바이트 정렬(Byte sort) 함수 확장형
5. 사용예제
1. 바이트 정렬(Byte sort)이란?
바이트 정렬(Byte sort)는 메모리에 데이터를 저장할 때 바이트 순서를 나타내는 용어로, 빅 엔디안과 리틀 엔디안 방식이 있다. 빅 엔디안(big-endial)은 최상위 바이트(MSB, Most Significant Byte)부터 차례대로 저장하는 방식이고, 리틀 엔디안(Little-endian)은 최하위 바이트(LSB, Least Significant Byte)부터 차례대로 저장하는 방식이다. 시스템에서 사용하는 바이트 정렬 방식은 CPU와 운영체제에 따라 다르다.
2. 바이트 정렬(Byte sort) 사용 경우
바이트 정렬 방식을 고려해야 하는 경우
1)IP 주소, 포트 번호와 같이 프로토콜 구현을 위해 필요한 정보
두 호스트가 포트 번호의 바이트 정렬 방식을 약속하지 않으면 포트 번호 해석이 달라져 데이터가 잘못된 목적지 프로세스에 전달 될 수 있다. 이를 해결하기 위해 IP 주소와 포트 번호의 바이트 정렬 방식은 빅 엔디안으로 통일해 사용한다. 네트워크 용어로는 빅 엔디안을 네트워크 바이트 정렬(network byte ordering)이라 한다.
2)응용 프로그램이 주고받는 데이터
두 호스가 주고받는 데이터에 대해 바이트 정렬 방식을 약속하지 않으면 데이터 해석 문제가 발생할 수 있다. 서버와 클라이언트를 같이 제작하는 경우라면 바이트 정렬 방식을 둘 중 하나로 통일해서 구현하면 된다. 대게는 네트워크 바이트 정렬(빅 엔디안) 방식을 사용한다. 클라이언트만 제작한다면 기존 서버가 정한 바이트 정렬 방식을 따르면 된다.
3. 바이트 정렬(Byte sort) 함수
u_short htons(u_short hostshort); host-to-network-short
u_long htonl(u_long hostiong); host-to-network-long
u_short ntohs(u_short netshort); network-to-host-short
u_long ntohl(u_long netlong); network-to-host-long
Hton*()함수는 호스트 바이트 정렬로 저장된 값을 받아서 네트워크 바이트 정렬로 변환한 값을 리턴 한다.
Ntoh*() 함수는 네트워크 바이트 정렬로 저장된 값을 입력으로 받아서 호스트 바이트 정렬도 변환한 값을 리턴 한다.
*s() 함수는 16비트 값을, *l() 함수는 32비트 값을 입력으로 받으므로 데이터 크기에 적합한 버전을 선택하여 사용 한다.
일반적으로 hton*()함수는 응용 프로그램이 소켓 함수에 데이터를 넘겨주기 전에 호출하며, htoh*()함수는 소켓 함수가 결과로 리턴한 데이터를 응용 프로그램이 출력 등의 목적으로 사용하기 전에 호출 한다.
4. 바이트 정렬(Byte sort) 확장 함수
int WSAHtons(SOCKET s, u_short hostshort, u_short *Ipnetshort);
int WSAHtonl(SOCKET s, u_short hostlong, u_short *Ipnetlong);
int WSANtohs(SOCKET s, u_short netshort,u_short *Iphostshort);
int WSANtohl(SOCKET s, u_short netlong, u_short *Iphostlong);
Winsock2.x에서는 바이트 정렬을 위해 다음과 같은 확장 함수도 지원한다.
첫 번째 인자로 소켓 디스크립터를 사용하고, 변환된 결과를 리턴 값이 아닌 세번째 인자로 전달한다는 차이가 있다.
5. 사용예제 소스
|