Recommanded Free YOUTUBE Lecture: <% selectedImage[1] %>

설명

시스템의 Little endian인지 Big endian인지 검사한다. endian에 대한 자세한 내용은 endian에 대해서를 참고하기 바란다.

사용방법

#define BIG_ENDIAN     0
#define LITTLE_ENDIAN  1

int endian(void);
시스템의 endian을 검사해서 Little이면 1을 Big이면 0을 리턴한다.

#include <stdio.h>
#include <endian.h>

int main()
{
    if ( endian() == LITTLE_ENDIAN)
        printf("Little endian\n");
    else
        printf("Big endian\n");
}

코드

int endian(void)
{
    int i = 0x00000001;
    if ( ((char *)&i)[0] )
        return LITTLE_ENDIAN;
    else
        return BIG_ENDIAN;
}

또 다른 코드

아래 같이 생긴 코드는 무슨 문제가 있을까?
int endian(void)
{
    int i = 0x00000001;
    return ((char *)&i);
}

ntohl(3)의 구현
uint32 get_data(void *mem, byte size)
{
    uint32 data = 0;
    byte i;

    if(size <= 4)
    {
        for(i = 0; i < size; i++)
        {
            data = ((uint32)data << 8) | ((byte *)mem)[i];
        }
    }
    return(data);
}

htonl의 구현
  1. if가 들어갔지만 가독성이 좋은 코드
    uint32 htonl(uint x)
    {
    	int i=0x00000001;
    	char ar[4];
    
    	if ( ((char *)&i)[0] )
    	{
    		byte a[4];
    		byte b[4];
    	
    		*((uint32 *)a) = x;
    		b[0] = a[3];
    		b[1] = a[2];
    		b[2] = a[1];
    		b[3] = a[0];
    		return *((uint32 *)b); 
    	}
    	else
    	{
    		return x;
    	}
    }
2. if가 없지만 가독성이 나쁜 코드 (cpu의 endian 특성을 이용한 함수)
uint32 htonl(uint x)
{
	char ar[4];
	ar[0] = (x & 0xff000000) >> 24;
	ar[1] = (x & 0x00ff0000) >> 16;
	ar[2] = (x & 0x0000ff00) >> 8;
	ar[3] = (x & 0x000000ff) >> 0;
	return *(uint32 *)ar;
}

3. 보너스 암호 코드
uint32 htonl(uint x)
{
	char ar[4];
	for(i=0; i<4; i++)
	{
		ar[i] = (x & (0xff << ((3-i)*8))) >> 8*(3-i);
	}
	return *(uint32 *)ar;
}

변경사항