Develope/MFC2013. 5. 20. 18:16

최근, 안드로이드 소켓 프로그래밍을 하면서,


이전에 만들어놓은 MFC 기반 서버와 통신을 하는 테스트 앱을 만들게 되었다.


여기서 발생한 문제가, 안드로이드에서 보낸 패킷이 서버에서 쓰레기값같이 이상하게 나온다는 것 !!!


이리저리 찾아보니 endian 문제였다. endian 이란 무엇인가 ?!?!




(그림 발췌 : Siren 님 Blog)


위 그림을 보면 제일 이해가 될듯 하다.


위의 0A 0B 0C 0D 라는 데이터 값을 저장 할 때, (10진수로는 168496141 )


Little-endian 은 메모리 첫 주소에 맨 뒤의 데이터부터 저장한다.


이와 반대로 Big-endian 은 맨 앞의 데이터부터 저장한다.


이 차이점은 생각보다 크다.


내 경험대로, Big-endian 을 사용하는 시스템에서 데이터를 그대로 보내고, Little-endian을 사용하는 시스템에서 송신하여


byte order의 변환 없이 그대로 사용하게 된다면,


0D 0C 0B 0A 로 값을 처리하게 된다. (10진수 2188893066)


이렇게 값이 완전 틀려져버리게 되므로, 사용되는 시스템의 차이에 따라 서로 맞추어서 한쪽에서 변환해야 할 필요성이 생긴다.


다시 정리를 해보자면,


Big-endian : High Order Byte

Little-endian : Low Order Byte


를 말하는 것이며,


Intel 기반 Processor 는 Little-endian 을, Power PC (Wii, PS3, Sun, 모토로라 등..)은 Big-endian을 사용한다.


곁귀로 듣기엔, 네트워크 상에서는 결국 Big-endian 으로 패킷이 전송되는데, 하위단에서 CPU 아키텍쳐 때문에 Little-endian 으로 변환된다는 말도 있다. (아직 사실여부는 조사가 필요...)


※ 문제는, Structure 로 맞추어져 있는 데이터의 집합으로 패킷으로 통신을 할 경우,

    이놈들을 일일히 내부 데이터들의 byte order를 바꿔줘야 하는듯 하다.

    (미치겠다... 귀찮...)



Posted by AsCarion