프로그래밍/리눅스 프로그래밍

[byteordering] big endian vs little endian

jinkwon.kim 2018. 11. 14. 11:41
728x90
반응형

[byteordering] big endian vs little endian



1. Byte Ordering이란?

  - 데이터를 메모리 어떠한 순서로 저장 할 지를 정의한 것이다.

  - 입력 데이터 : 12345678

  1) Big Endian

    - 숫자 데이터(12345678)를 기준으로 설명 하면 자리수 단위가 높은 단위에서 작은 자리수 단위 방향으로 메모리에 순차적으로 저장한다.



  2) Little Endian 

    - 숫자 데이터(12345678)를 기준으로 설명 하면 자리수 단위가 단위에서 높은 자리수 단위 방향으로 저장한다.



2. Byte Ordering을 알아야 하는 이유??

  - network 상의 데이터 전송 순서와 host(시스템을 칭한다)상의 데이터 저장 순서가 다르기 때문이다.

  - 이렇기 때문에 ordering이 꼬이지 않게 코딩을 해야 한다.

  

3. netowkr Byte Ordering 

  - Big Endian 


4. host Byte Ordering 

  - CPU에 따라 달라진다.

 1) Big Endian 계열 CPU

   - Intel-x86/x64 

   - AMD

 2) Little Endian 계열 CPU

   - IBM

   - Motorola

   - Sun Sparc

   - RISC

   - PowerPC

   

5. Byte Ordering 변환 함수 (C언어 기준)

  - 필요한 헤더 : #include <arpa/inet.h>  

  1) host -> network 

    (1) uint32_t htonl(uint32_t hostlong);

      - 32bit(=4byte) 데이터를 변환

      - host ordering 32bit 값을 넣게 되면 network ordering 32bit 값은 반환

    (2) uint16_t htons(uint16_t hostshort);

      - 16bit(=2byte) 데이터를 변환

      - host ordering 16bit 값을 넣게 되면 network ordering 16bit 값은 반환   

  2) network -> host

    (1) uint32_t ntohl(uint32_t netlong);

      - 32bit(=4byte) 데이터를 변환

      - network ordering 32bit 값을 넣게 되면 host ordering 32bit 값은 반환

    (2) uint16_t ntohs(uint16_t netshort);

      - 16bit(=2byte) 데이터를 변환

      - network ordering 16bit 값을 넣게 되면 host ordering 16bit 값은 반환


6. 실전 예제

  1)  예제 코드

    - 현재 운영 시스템의 endian은 little endian 입니다. 

# include <stdio.h>
# include <arpa/inet.h>

int main()
{
int a, b;

a = 0x12345678;
b = htonl(0x12345678);

printf("%d\n", a);
printf("%d\n", b);

return 0;
}

  2) 예상 결과

    - 변수 a는 little Endian으로 시스템에 저장되어야 합니다 (왜??? 시스템이 little endian 이기때문 입니다)

    - 변수 b는 big Endian 으로 시스템에 저장되어야 합니다 (왜??? network ordering으로 변환 했기 때문 입니다)


  3) 실제 결과(gdb로 확인)

    - 변수 a 메모리 Host byte Ordering (little Endian으로 저장 되어있습니다.)



    - 변수 b 메모리 Network byte Ordering (Big Endian으로 저장 되어있습니다.)



6. 트러블 슈팅 

  1. socket 프로그래밍중 주고 받는 데이터가 깨지면 byte ordering이 맞는지 확인 해야한다. 

  2. socket 프로그래밍중 주고 받는 데이터가 깨지면 32bit으로 변환했느지 16bit으로 변환 했는지 확인 해야한다.

728x90
반응형