워낙에 많고 다양한 모바일 플랫폼을 개발을 하고(한 툴에 겨우 익숙해지면 다른 플랫폼 개발 프로젝트가 떨어지게 된다.) 그 다양한 이기종간에 네트워크를 개발하다보니...
바이트 오더링이 여간 신경써지는게 아니었다.
서로 네트워크 패킷이 오갈 때 사용하는 바이트 배열값이 동일한 플랫폼에서는 신경 안 써도 되는 것이지만, 이기종이다 보니 종종 원치 않는 값을 얻어오기도 한다.
게다가 모바일에서 주로 사용하는 Arm 프로세서라는 넘은 스위치 조작에 따라 빅엔디안과 리틀 엔디안을 설정할 수 있다.(둘다 지원한다는 소리다.)
그래서 값을 바이트 배열에 넣을 때는 무조건 아래 함수를 사용하는 버릇이 생겼다.
int getUint32(unsigned char * data, int index)
{
return ((data[index] & 0xff) << 24) | ((data[index + 1] & 0xff) << 16) | ((data[index + 2] & 0xff) << 8) | (data[index + 3] & 0xff);
}
void setUint32(unsigned char * data, int index, int i)
{
data[index] = (byte)(0xff & (i >> 24));
data[index + 1] = (byte)(0xff & (i >> 16));
data[index + 2] = (byte)(0xff & (i >> 8));
data[index + 3] = (byte)(0xff & i);
}
int getUint16(unsigned char * data, int index)
{
return (int)(((data[index] & 0xff) << 8) | (data[index + 1] & 0xff));
}
void setUint16(unsigned char * data, int index, int i)
{
data[index] = (byte)(i >> 8);
data[index + 1] = (byte)i;
}
64비트도 뭐... 이런식으로 하나 만들어서 사용해 왔다.
워낙 오래된 버릇이라 불편한 것도 몰랐고, 이젠 당연히 쓰게 되었다.
어느날 팀원에게 소스 주면서 아무 생각없이 이걸로 쓰라고 하자..
"왜요? 귀찮자나요.."
라고 한다..
달리 반박할 말이 생각나질 않는다..
동일한 플랫폼 안에서는 별 필요 없지 않은가????
쓸데 없는 버릇인가?
아닌 것 같은데......