Little endian system에서 Big endian system 대응 소프트웨어를 작성해야 합니다..

jaeung24k의 이미지

제목 그대로입니다.

제 노트북이 Little endian인데 아무 생각없이 코딩을 하다보니 Little endian에서 동작하는 프로그램을 작성했네요..

물론 제 코드는 Byte 연산이 많아서 Endian 종류에 종속적입니다.

다행히 타겟보드가 ARM인데 Little endian으로 설정되어 있어서 동작하기는 합니다만...

문제는 타겟시스템의 종류가 다양하여 같은 ARM보드라도 Big endian으로 설정되어 있을 수 있다는 거네요.

Little endian 개발환경에서 Big endian에서 동작하도록 어떻게 개발하며 어떻게 디버깅할지 막막하네요...

선배 임베디드 개발자분들의 조언을 부탁드립니다..

peecky의 이미지

타겟 시스템에 상관없이 값을 항상 big endian으로 변환해주는 함수 및 그 역함수가 있습니다.

http://linux.die.net/man/3/ntohl
http://beej.us/guide/bgnet/output/html/multipage/htonsman.html

int 값을 파일에 저장하거나 네트워크로 전송할 때, 즉 결과물을 다른 머신에서 읽을 가능성이 있을 때 사용하면 endian 문제를 해결할 수 있습니다.

jaeung24k의 이미지

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 코드를 테스트 할 수 있는 방법을 찾는 중입니다..

오늘도 생명과 호흡을 주심에 감사합니다.

익명 사용자의 이미지

커널이나 다른 임베디드 시스템의 경우 조건부 컴파일로 해결하더군요.

제가 생각해본 해결방안입니다.

** 구조체(자료구조)는 조건부 컴파일 **

struct example {
 
    #ifdef BIG_ENDIAN
    char x;
    char y;
 
    #else /* if little endian system */
    char y;
    char x;
 
    #endif /* BIG_ENDIAN */
};

그리고 데이터 조작은 매크로를 통하여 간접적으로 접근하면될 것 같습니다.

jaeung24k의 이미지

답변감사드립니다.

말씀해주신 조언을 참고하여 문제를 해결하였습니다.

다른분들에게 도움이 되실까하여 허접하지만 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;
}

오늘도 생명과 호흡을 주심에 감사합니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.