본문 바로가기
Programming/Socket

[C/C++/소켓프로그래밍]hton ntoh (htons,htonl,ntohs,ntohl) 빅 엔디안과 리틀 엔디안 변환

by whitele 2021. 3. 6.
반응형

소켓에서 hton, ntoh함수

 두 함수는 리틀 엔디안, 빅 엔디안을 사용하는 체계에서 빅엔디안 또는 리틀엔디안으로 변환해주는 함수이다. TCP/IP는 빅 엔디안 방식을 사용하므로 리틀 엔디안 체제에서 사용시 빅 엔디안으로의 자료 변환이 필요하다. 때문에 네트워크 소켓통신에서 빅엔디안, 리틀 엔디안을 다뤄야 한다. 시스템마다 빅엔디안 리틀엔디안 사용이 다르지만 보통은 빅엔디안을 사용한다 하지만 리틀엔디안을 사용하는 경우 빅엔디안형식으로의 변환이 필요하다.

 

Big-endian Little-endian

빅 엔디안은 시작 주소에 데이터의 최상위 비트(MSB)가 오도록 저장한다.

리틀 엔디안은 시작주소에 최하위 비트(LSB)가 오도록 저장한다.

 

 

4byte int 0x1234

  a a+1 a+2 a+3
Big-endian 0x12 0x34 0x56 0x78
Little-endian 0x78 0x56 0x34 0x12

htons htonl ntohs ntohl함수

htons 함수는 2byte(short형) 데이터에 대해 호스트 바이트 순서를  빅 엔디안 바이트 순서로 변환할 때 사용한다. htonl는 (4byte) 데이터를 사용하는 차이만 있을 뿐 동일 한 기능이다.

반대로 ntohs 는 2byte 데이터에 대해 호스트 바이트 순서를 리틀 엔디안 바이트 순서로 변환할 때 사용한다. ntohl역시 (4byte)데이터를 다루는 차이만 있다.

#include <netinet/in.h>

R=htonl(unsigned long data)//return unsigned long
R=htons(unsigned char data)//return unsigned char
R=ntohl(unsigned long data)//return unsigned long
R=ntohs(unsigned char data)//return unsigned char

netinet/in.h 헤더를 포함 해야한다.

728x90
반응형

댓글