#include <winsock2.h>
#include <stdio.h>

typedef unsigned short u16; // 16bit (2byte) 정의
typedef unsigned long u32; // 32bit (4byte) 정의

bool IsLittleEndian()
{
 u16 x1, x2;
 x1 = 0x1234;   // x1에 임의의 값 대입(종단 시스템 바이트 정렬)
 x2 = htons(x1);   // x2에 x1값을 빅엔디안 변환

 if(x1 == x2)   // x1 과 x2 가 같다면 종단 시스템이 빅 엔디안이란 뜻..
  return false;
 else
  return true;
}

bool IsBigEndian2()   // 중복 소스 싫어요 >_<
{
 if(IsLittleEndian())
  return false;
 else
  return true;
}

bool IsBigEndian()
{
 u16 x1, x2;
 x1 = 0x1234;
 x2 = htons(x1);

 if(x1 == x2)
  return true;
 else
  return false;
}

int main(int argc, char* argv[])
{
 // 윈속 초기화
 WSADATA wsa;
 if(WSAStartup(MAKEWORD(2,2), &wsa) != 0)
  return -1;

 u_short x = 0x1234;
 u_long y = 0x123456789;

 u_short x2;
 u_long y2;

 // 호스트 -> 네트워크
 printf("호스트 -> 네트워크\n");
 printf("0x%x -> 0x%x\n", x, x2 = htons(x));
 printf("0x%x -> 0x%x\n", y, y2 = htonl(y));

 // 네트워크 -> 호스트
 printf("네트워크 -> 호스트\n");
 printf("0x%x -> 0x%x\n", x2, ntohs(x2));
 printf("0x%x -> 0x%x\n", y2, ntohl(y2));

 // 잘못 사용
 printf("잘못 사용예\n");
 printf("0x%x -> 0x%x\n", x, htonl(x));

 printf("\n\n빅엔디안 함수 사용중...\n");
 if(IsBigEndian())
  printf("IsBigEndian()에서 알리는 결과 : 이 컴퓨터는 빅엔디안 사용\n");
 else
  printf("IsBigEndian()에서 알리는 결과 : 이 컴퓨터는 리틀 엔디안 사용\n");
 
 printf("\n\n리틀 엔디안 함수 사용중...\n");
 if(IsLittleEndian())
  printf("IsLittleEndian()에서 알리는 결과 : 이 컴퓨터는 리틀 엔디안 사용\n");
 else
     printf("IsLittleEndian()에서 알리는 결과 : 이 컴퓨터는 빅엔디안 사용\n");
 
 
 // 윈속 종료
 WSACleanup();
 return 0;
}


+ Recent posts