반응형
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
반응형