Little endian system에서 Big endian system 대응 소프트웨어를 작성해야 합니다..
글쓴이: jaeung24k / 작성시간: 금, 2015/03/13 - 11:06오전
제목 그대로입니다.
제 노트북이 Little endian인데 아무 생각없이 코딩을 하다보니 Little endian에서 동작하는 프로그램을 작성했네요..
물론 제 코드는 Byte 연산이 많아서 Endian 종류에 종속적입니다.
다행히 타겟보드가 ARM인데 Little endian으로 설정되어 있어서 동작하기는 합니다만...
문제는 타겟시스템의 종류가 다양하여 같은 ARM보드라도 Big endian으로 설정되어 있을 수 있다는 거네요.
Little endian 개발환경에서 Big endian에서 동작하도록 어떻게 개발하며 어떻게 디버깅할지 막막하네요...
선배 임베디드 개발자분들의 조언을 부탁드립니다..
Forums:
타겟 시스템에 상관없이 값을 항상 big
타겟 시스템에 상관없이 값을 항상 big endian으로 변환해주는 함수 및 그 역함수가 있습니다.
http://linux.die.net/man/3/ntohl
http://beej.us/guide/bgnet/output/html/multipage/htonsman.html
int 값을 파일에 저장하거나 네트워크로 전송할 때, 즉 결과물을 다른 머신에서 읽을 가능성이 있을 때 사용하면 endian 문제를 해결할 수 있습니다.
peecky님 답변 감사합니다. network
peecky님 답변 감사합니다.
network ordering을 고려해본바 있으나...
변수중 2byte 크기의 데이터의 경우 htons() ntohs() 함수가 바이트오더 변환을 완변하게 지원해 주지 않는것 같더군요..
더군다나 아스키코드 범위를 벗어나는 데이터라서 atoi()를 사용하지 못하고
..
char buf[4];
read(fd, buf, sizeof(buf));
int var = 0;
int *p = (unsigned int) buf;
var |= *p;
..
이런 방식으로 데이터를 변환해야하기 때문에 쉽게 htons() ntohs() 함수들을 사용하지 못했습니다.
그래서 Little endian시스템에서 Big endian 코드를 테스트 할 수 있는 방법을 찾는 중입니다..
오늘도 생명과 호흡을 주심에 감사합니다.
htons, ntohs..
커널이나 다른 임베디드 시스템의 경우 조건부 컴파일로 해결하더군요.
제가 생각해본 해결방안입니다.
** 구조체(자료구조)는 조건부 컴파일 **
그리고 데이터 조작은 매크로를 통하여 간접적으로 접근하면될 것 같습니다.
답변감사드립니다. 말씀해주신 조언을 참고하여 문제를
답변감사드립니다.
말씀해주신 조언을 참고하여 문제를 해결하였습니다.
다른분들에게 도움이 되실까하여 허접하지만 1~4바이트의 데이터에 대해 byte order를 변환하여 정수를 리턴하는 소스코드를 공유합니다.
int STR_to_INT(char *str, int len) {
flag_system_endian = -1;
int i = 0x00000001;
unsigned int i, ret;
unsigned int *p_str;
char buf[4];
memset(buf, 0x00, sizeof(buf));
if ( ((char *)&i)[0] )
flag_system_endian = 0; //LITTLE ENDIAN SYSTEM
else
flag_system_endian = 1; //BIG ENDIAN SYSTEM
if(flag_endian == 0)
for(i=0; i < 4; i++)
if(i < len)
buf[i] = str[i];
else
buf[i] = 0x00;
else if (flag_endian == 1)
for(i=1; i < 5; i++)
if((len - i) >= 0)
buf[4-i] = str[len-i];
else
buf[4-i] = 0x00;
ret = 0;
p_str = (unsigned int *)buf;
ret |= *p_str;
}
return ret;
}
오늘도 생명과 호흡을 주심에 감사합니다.
댓글 달기