Admin | Write | GuestBook
[공지] 해당 블로그에 용건이 있으신 분께서는 http://blog.fore.kr/ 의 방명록(Guestbook)으로 부탁드립니다.
갑작스레 떠오른 비트 구조체와 바이트 순서의 관계
Category : Programming/Programming Talk | URL : | Written by 포레 ( 2014. 10. 28. 11:57 ) | 신고

최근, 모사에서 문제가 유출됐다고해서 봤었는데 ( 지금은 삭제됨. )

 

정확하게는 기억 안나는데 어렴풋이 기억에 남은 것중 하나가

 

32bit 데이터를 저장하는 메모리가 있을때 마지막 1bit는 뭐시고 15bit는 뭐시고 16bit는 뭐시고해서

 

16bit 만 때어내서 결과를 출력해내라 ? 라는 문제가 있었다.

 

문제의 요지는 간단하므로 '결과만'을 출력하자고 하면

 

 

 

 int extract(int n){

  return n&0x0000FFFF;

 }

 

 

하면 끝나버린다.

 

하지만, 저 문제를 출제한 이유는 뭘까 . . .

 

아마, '비트 구조체' 를 이용한 문제가 아닐듯 싶다.

( 보통 쓰일 일 없는 이 녀석이지만, 가끔 압축 알고리즘 등과 같은 소스 분석하다보면 가끔가다 나온다. )

 

 

 #include <stdio.h>

 

typedef unsigned int DWORD;

 

 typedef union _TEST{
  struct {
   DWORD  LowPart:16;
   DWORD  HighPart:15;
   DWORD  Signature:1;
  }m;
  DWORD   dwCode;
 }TEST, *PTEST;

 

 int extract(int n){

    TEST i;

    i.dwCode = n;

    return i.m.LowPart;

 }

 

 int main(void){

  printf("%d",extract(0xFFFF));
  return 0;
 }

 

 

대충 요딴식으로 풀면 풀리겠다.

 

그런데 잘 생각해보니, 이렇게하면 바이트 순서(byte order)로 인해 값이 꼬이는 문제가 있지 않을까 떠올랐다.

 

여기서 잠깐 훑어보는 바이트 순서란 ?

 

크게 바이트 순서는 크게 빅 엔디언(Big-endian) 과 리틀 엔디언(Little-endian) 으로 나뉜다.

 

리틀 엔디언은 값을 거꾸로 저장하는 방식을 뜻한다.

 

예를 들어 00 00 00 01h 라는 값이 있을 경우, 저장하게 되면 01 00 00 00 와 같이 거꾸로 저장된다.

 

반대로, 빅 엔디언은 00 00 00 01h 라는 값이 있을시, 00 00 00 01 와 같은 형식으로 그대로 저장하게 된다.

 

최근 개인용 PC컴퓨터는 죄다 리틀 엔디언으로 나오니 크게 문제는 없어보지만,

 

위와 같은 이유로 컴파일러에 의해 01 00 00 00 와 같은 리틀 엔디언으로 값이 저장되면

 

빅 엔디언으로 읽는 컴퓨터로 갈 시 01 00 00 00 인 상태 그대로 읽어오는게 아닐까 하는

 

착각에 빠졌는데 . . .

 

잘 생각해보니, PE 파일 내에서 머신 옵션이 있기에 크게 상관없을거로 판단되는 결론이다.

( 하기사, 만든 사람들이 나같지 않았을테니 쓸데없는 걱정이였던듯 )

 

 

Category
분류 전체보기 (605)
Notice (6)
Programming (79)
DISKER (1)
FSCH (7)
Caption (0)
Rest Time ! (443)
Hobby (64)
Tour (5)
Blind Post (0)
Recent Post
Recent Comment
Link
Calender
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Total :
Today :
Yesterday :