Byte 순서 (Big-endian & Little-endian)

Big-endian은 값을 앞에서부터 기록하고, Little-endian은 값을 뒤에서부터 기록한다고 알고있자. 예를들어, 0x12345678을 binary로 기록한다고 하면, 각각은 다음과 같이 기록된다.

  • Big-endian: 12 34 56 78
  • Little-endian: 78 56 34 12

C++에서 ‘#include <arpa/inet.h>’를 이용해 include 해 주면, Byte 순서를 바꿔주는 네가지 함수를 사용할 수 있다.

  • uint16_t ntohs(uint16_t)
  • uint32_t ntohl(uint32_t)
  • uint16_t htons(uint16_t)
  • uint32_t htonl(uint32_t)

각각 uint16_t 또는 uint32_t형 변수를 받아서, uint16_t 또는 uint32_t형 변수를 반환한다. 입력 된 변수의 주소값 Byte 순서를 바꿔서 반환하므로, 반환되는 값은 전혀 다른값이 돼 있다. 물론 값을 쓰려고 이런일을 하는건 아닐테니 그냥 참고사항으로 적어둔다.

위 함수들은 XtoY(s,l) 형태로 이해하면 되는데, X에서의 Byte순서의 (short, long) 변수를 Y에서의 Byte순서로 바꿔서 반환하라는 의미이다. 만약 X에서의 Byte순서와 Y에서의 Byte순서가 같다면 입력값이 그대로 반환된다.

참고로 uint16_t 와 uint32_t에서 u는 unsigned를 의하고, 16과 32는 각각 비트수를 의미, _t는 typedef를 이용해서 정의된 변수형이라는 의미이다. 따라서 uint16_t는 unsigned형 int이기 때문에 음수는 사용할 수 없고, 16비트이므로 2바이트의 크기를 가지는 변수형이라는걸 알 수 있다.

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다

This site uses Akismet to reduce spam. Learn how your comment data is processed.