프로그래밍/2024 네트워크 프로그래밍

4. 빅 엔디안, 리틀 엔디안

데일리 백수 2025. 1. 6. 19:16
#include <stdio.h> 
#include <netinet/in.h> 
 
typedef union { 
 short sVal; 
 char cVal[2]; 
} TWO_BYTE_t; 
 
int main(void) 
{ 
 	TWO_BYTE_t data; 
 
 	data.sVal = 0x1234; 
 	if(data.cVal[0] == 0x34 && data.cVal[1] == 0x12) 
  		printf("Little Endian System.\n"); 
 	else 
  		printf("Big Endian System.\n"); 
 
 	in_port_t portNumber = 0x1234; 
 	in_addr_t ipAddress = 0x12345678; 
 
 	printf("Port Number HBO: %#04x, NBO: %#04x\n", portNumber, htons(portNumber)); 
 	printf("IP Address HBO: %#08x, NBO: %#08x\n", ipAddress, htonl(ipAddress)); 
 
 	printf("sizeof(short): %zu bytes\n", sizeof(short)); 
 	printf("sizeof(int): %zu bytes\n", sizeof(int)); 
 	printf("sizeof(long): %zu bytes\n", sizeof(long)); 
 	printf("sizeof(long long): %zu bytes\n", sizeof(long long)); 
 
 	return 0; 
}

엔디안 검사와 네트워크 바이트 순서 변환을 확인하는 코드입니다.

먼저 헤더파일 및 union 선언부터 살펴보겠습니다.

Union을 이용해 하나의 메모리 공간을 sVal cVal이라는 데이터형으로 해석할 수 있도록 선언했습니다. Short->2바이트 char[2] 2바이트 공간이 될 것입니다.

앞서 선언한 TWO_BYTE_t 유니온을 선언한 후, sVal 16진수 0x1234를 저장합니다\

만약 실행한 하드웨어가 리틀앤디안일 경우 배열의 첫 주소에 34, 다음에 12가 저장될것입니다. 빅 앤디안일경우 배열의 첫 주소에 12 다음주소에 34가 저장될 것입니다.

 

In_port_t in_addr_t를 사용하여 포트번호와 ip주소를 설정합니다. 그 후 호스트()의 시스템에서 사용하는 형식 , 네트워크 시스템에서 사용하는 형식으로 출력합니다 전자는 시스템에 따라 다를것이고, 후자는 빅 앤디안 형식으로 출력될 것입니다.

시스템에서 사용하는 자료형의 크기를 출력합니다. 살펴볼점은 long의 사이즈는 시스템에 따라 다를 수 있다는 것입니다(word의 크기가 예전에는 int였지만 현재는 long)

실행결과 본인의 시스템은 리틀 앤디안이며, 그에 따라 빅앤디안 시스템인 네트워크 바이트의 결과와 차이를 보입니다.