2011. 6. 1. 11:40

시발 오늘은 Byte Order 라고 불리우는 바이트 순서에 대해 정리좀 하자.
정리에 앞서 요 며칠 전에 어떤 씹쌔가 메일로 "숙제"를 도와 달라고 하던데.. 숙제는 니 "뇌"로 하세요~

계속해서, 네트워크 프로그램을 개발하다 보면 꼭 한번씩 겪은 문제가 있다. 바로 이 기종간 통신이다. 여기서 말하는 이기종간 통신이라는 건 운영체제가 다르다는 말도 완벽히 틀린건 아니지만 그렇다고 100% 맞는 말도 아니다. 여기서 필자가 말하는 이기종이란 Byte Order의 차이를 말한다.

저런 Byte Order의 차이는 프로세서(CPU) 방식의 차이에서 발생한다. 프로세서의 방식이 얼마나 여러가지가 존재하는지는 모르겠지만 내가 알고 있는건 두가지이다.

RISC(Reduced Instruction Set Computer) - Big Endian
이 방식은 네트워크 전송에서 기본적으로 사용되는 방식이다. RISC 프로세서는 Sparc, Motorola CPU들이 채택하고 있고, 이 방식의 장점은 가독성이 뛰어나다는 점이다. 왜냐하면 MSB(Most Significant Bit)가 왼쪽에 있기 때문이다.
간단히 말해 인간새끼들은 기본적으로 글을 왼쪽에서 오른쪽으로 읽으니까 쉽다는 말이다.
주로 유닉스 계열의 OS에서 많이 사용 된다.




CISC(Complex Intruction Set Computer) - Little Endian
이 방식은 당연히 Big Endian과 반대이다. 이 방식은 우리가 많이 사용하는 Intel 계열의 CPU에서 주로 사용하는 방식이다. 이 방식은 우리가 보기에는 불편하지만 컴퓨터가 계산하는데는 더 편하다.
왜그러냐면 예를 들어서 short 타입의 0x0102가 있다고 하자. 근데 이걸 long 타입으로 확장하려고 하면 기냥 뒤에 0x00으로 채워진 2바이트만 넣으면 되니까.
주로 우리가 많이 사용하는 윈도우즈 계열의 OS가 사용하는 방식이다.



ㅋㅋ 그림만 보니까 시발 뭐가 뭔지 헤깔릴 수도 있는 씹딱구들을 위해 필자가 아주 친절하게 조촐한 예제까지 마련해주마 ㅋㅋ.
그림에 나온 숫자는 16진수 0x01020304 10진수로 16909060.

저게 프로그램으로 말하면

//---------------------------------------------------------------------------
#include <stdio.h>
#include <conio.h>
//---------------------------------------------------------------------------
int main(int argc, char* argv[])
{
  int iTag = 0x01020304;
  char cTag[4];

    printf("\niTag = 0x%08x\n\n", iTag);

  for(int i=0; i<4; i++) {
    cTag[i] = ((char *)&iTag)[i];
    printf("\tiTag의 %d번지 : 0x%02x\n", i, cTag[i]);
  }

  printf("\nPress key...");
  getchar();
  return 0;
}
//---------------------------------------------------------------------------

이래도 모르면 프로그램 개발하지 말고 시발 죽으라고는 말 못하겠고 내 블로그에서 사라지세여~~
끝!

'프로그래밍' 카테고리의 다른 글

Thread ( 스레드 ) ?  (2) 2011.05.30
Log 찍기  (0) 2011.05.17
SQLite 설치 및 사용법  (5) 2011.05.11
Name Mangling (Name Decoration)  (0) 2011.05.03
Calling Convention ( 호출 규약 ) __cdecl, __stdcall, __fastcall  (3) 2011.05.02
Posted by 뿌직