CISC(Complex instruction set computer)와 RISC(Reduced instruction set computer)간에 서로 Byte ordering 이 달라서 정수형 변수를 전달할 때 문제가 생긴다
[Big-endian format]
바이트 단위로 주소가 매겨지는 컴퓨터 기억장소에서 바이트 이상의 큰 데이터가 저장되는 형식의
하나입니다. 이 방식에서는 데이터의 최상위 비트가 가장 높은 주소에 저장되므로 사람이 보기에는
거꾸로 배열된것 처럼 보입니다. Risc 기반의 유닉스나 리눅스가 이 방식으로 처리됩니다.
[Little-endian format]
바이트 단위로 주소가 매겨지는 컴퓨터에서 두바이트 이상의 데이터를 기억장소에 저장하는 형식의
하나입니다. 이 방식에서는 사람이 보는 것과 같이 최상위 자리의 바이트부터 앞의 주소에 차례대로
기억됩니다. Cisc기반의 윈도우즈 제품군은 이 방식대로 처리됩니다.
따라서 바이트 정렬 기법이 서로 다른 시스템끼리 통신을 한다면 한 바이트 보다 많은 메모리 블락을 서로 주고
받을때 문제가 발생합니다. 바이트로 정보가 나누어진 경우에는 문제가 되지 않습니다.
char temp[16];
위의 char 배열의 크기가 한 바이트보다 더 크더라도 바이트 단위로 정보가 나뉘어지기 때문에 상관없습니다.
문제가 되는건 아래와 같은 데이터 타입이겠죠.
// 바이트 정렬에 따라 영향을 받는 데이터 타입
short int, long int ( WORD, DWORD )
이것들은 데이터형 자체가 한 바이트보다 더 큽니다. 따라서 이런 경우에 문제가 됩니다.
우리가 주로 사용하는 방식이 little endian 이기 때문에 little endian 위주로 설명해 드리면, 0x1234 값을
short int 에 저장하면 실제로 바이트 단위로 배열되는 형태는 0x34, 0x12 와 같이 됩니다.
즉 상위바이트와 하위바이트가 역으로 형성되죠!! 하나 예를들면, 0x12345678을 long int 에 저장하면
바이트 단위로 배열 되는 형태는 다음과 같습니다.
// Little Edian 방식에서 0x12345678 을 저장하는 경우 바이트 단위로 배열되는 형태
0x78, 0x56, 0x34, 0x12
위 배열을 생각해보면, 크게 두 바이트씩 상하위가 엇갈리고 각각이 또 엇갈리는 형태로 배열되는거죠...
만약, Big endian 방식이라면 저장하는 형태가 0x1234, 0x12345678 그대로 저장될 것입니다.
따라서 호환이 될리가 없죠. 호환시켜주는 함수도 특별히 없습니다. 직접 조작을 하셔야 할것 같습니다.
보내기 전에 하시거나, 보낸후, 받는쪽에서 처리하시거나 해야 할것 같군요. 예를 하나 들죠.
보내는 곳이 little endian 이고 받는쪽이 big endian 이라고 하고 보내는 쪽에서 big endian으로 변경해서
보내도록 합시다.
short int send_data = 6;
short int big_endian_data = 0;
big_endian_data = ((send_data >> 8) & 0x00FF) | (send_data << 8);
위와 같이 구성하고 big_endian_data 값을 전송하면 받는 쪽에서는 특별한 변환 루틴없이 6 이라는 값을
정확히 받을수 있을겁니다. ^^; 다시한번 답변이 늦어서 죄송하다는 말을 드립니다.
하시는 프로그램에 도움이 되길 빌면서.. 이만 물러갑니다. 즐거운 하루되세요~
참고자료 : http://www.tipssoft.com/bulletin/board.php?bo_table=old_bbs&wr_id=8
'개발지식창고 > Tip&IT용어' 카테고리의 다른 글
NSIS 인스톨 스크립트 (0) | 2015.05.21 |
---|---|
Unity3D 에서 Visual Studio 2010 DLL Library 사용하기 (0) | 2015.01.27 |
윈도우 XP 단축키 모음 (0) | 2011.08.18 |
CString 개행문자 인식하기위한 팁 (0) | 2011.03.14 |
윈도우7 최적의 성능을 위해 설치후 해야할 3가지 (0) | 2010.11.28 |