반응형

문제 풀이: 엔디안 변환

 

글. 수알치 오상문.

 
다음 문제는 데이터를 메모리에 저장할 때 바이트 저장 순서와 관련된 것이다.
데이터를 메모리에 저장하는 방식에는 빅엔디안과 리틀엔디안이 있는데,
예를 들어 32bit unsigned int 305,419,896 (0x12345678)을 Big Endian과 Little Endian으로 나타내면 다음과 같다. 

00010010 00110100 01010110 01111000 (Big Endian) --> 0x12345678
01111000 01010110 00110100 00010010 (Little Endian) --> 0x78563412
 
Big Endian으로 저장된 데이터를 그대로 Little Endian 방식으로 읽었을 경우, 또는 반대의 경우에는 이상한 값이 되어버리기 때문에 Endian의 변환이 필요해진다. 예를 들어 위 예제의 Big Endian의 값을 그대로 Little Endian 방식으로 읽었을 경우 2,018,915,346 (0x78563412)이 된다.
이 들은 자신이 Endian을 변환해서 데이터를 보내주는 것을 원하지 않았기 때문에 일단 데이터를 받은 후에 자신들이 사용하는 Endian에 맞춰서 변환해야 한다. 당신은 이들을 도와 Endian을 변환하지 않고 받은 데이터를 원래의 데이터로 복원해주는 프로그램을 작성해야 한다.
 
[입력]
입력은 하나의 숫자(32bit unsigned int)이며, 제대로 보려면 반대 Endian 방식으로 변환해야 한다.
 
[출력]
입력에 대한 원래 데이터를 출력한다.
 
입력 예:  2018915346
출력 예:  305419896

[참고 소스 코드 1]  엔디안 검사하기 
#include <stdio.h>
int main()
{
  int x = 1;
 
  if(*(char*)&x == 1)
    printf("Little Endian\n");
  else
    printf("Big Endian\n");
 
  return 0;
}

[참고 소스 코드 2]
#include <stdio.h>
int main()
{
  unsigned int src = 0x12345678;
  unsigned int dest;
   
 //  printf("숫자를 입력하세요: ");
 //  scanf("%u", &src);
 
  dest = src>>24;
  dest += (src&0xFF0000u)>>8;
  dest += (src&0xFF00u)<<8;
  dest += src<<24;
 
  printf("0x%x -> 0x%x\n", src, dest);  // 0x78563412 -> 0x12345678
  printf("%u -> %u\n", src, dest);   // 2018915346 -> 305419896
 
  //printf("%u\n", dest);
  system("PAUSE");
 
  return 0;
}

 

<이상> 

 

 

반응형

+ Recent posts