[Socket] 연습문제 2

조아리 ㅣ 2024. 7. 4. 10:00

반응형

Q. 자신이 사용하는 시스템의 호스트 바이트 순서가 big endian 인지, little endian인지를 확인하는 프로그램을 작성하시오. (convert_order32() 함수를 사용하시오.)

 

big endian, little endian

실제로 메모리에 저장되는 방식 (바이트 순서)
* 예시 0x12345678
big endian > 12 34 56 78
little endian > 78 56 34 12

 

 

/* -------------------------------------------
 * 파일명:convert_order.c
 * 기 능 :4 바이트로 표현된 숫자의 바이트 순서를 바꾸는 프로그램
 * 컴파일:gcc convert_order.c -o convert_order
 * 사용법:./convert_order
 * -------------------------------------------*/

#include <stdio.h>

unsigned int convert_order32(unsigned int before){
    int i;
    int bfLen = 0;
    unsigned int mem = before;
    
// 8씩 시프트 시키기 위해 반복 횟수를 구하기
    for(mem; mem > 0; mem >>= 8){
        bfLen++;
    }
    
// 8씩 시프트, 8 비트씩 추출
    unsigned after = 0;
    for(i = 0; i < bfLen; i++){
    // 기존 비트를 높은 비트로 시프트 후에 추출한 8비트를 or시켜주기
        after = (after << 8) | (before & 0xFF);
        before >>= 8;
    }
    
// Endian 체크하기
    unsigned int chkEnd = 0x12345678;
    unsigned char *c = (unsigned char*)&chkEnd;

    size_t k;
    for(k = 0; k < sizeof(chkEnd); k++){
    	printf("%02X ", c[i]);
    }
    printf("\n");

    if(c[0] == 0x78){
    	printf("Little Endian\n");
    } else {
    	printf("Big Endian\n");
    }

    return after;
}

int main(){
    printf("입력 : 0x");
    unsigned int before;
    scanf("%x", &before);
    unsigned int after = convert_order32(before);

    printf("출력 : 0x%x\n", after);

    return 0;
}

 

 

실행 결과

$ ./convert_order
입력 : 0x45612345
78 56 34 12
Little Endian
출력 : 0x45236145
반응형