Home 엔디언(Endian)은 무엇일까?
Post
Cancel

엔디언(Endian)은 무엇일까?

글을 작성하게 된 계기**


데이터베이스 인터널스를 읽으며 엔디언(Endianess) 에 대해 알게 되었는데, 이를 정리하기 위해 글을 작성하게 되었습니다.



2. 엔디언


엔디언(Endianess)은 멀티 바이트 데이터가 메모리에 저장/전송될 때 바이트의 순서를 정의하는 방식 입니다. 데이터의 바이트가 어떤 순서로 배열될지를 결정하여 시스템 간의 데이터 호환성정확성 을 보장합니다. 여기에는 빅 엔디언(Big Endian)리틀 엔디언(Little Endian) 이 존재합니다.

In computing, endianness is the order in which bytes within a word of digital data are transmitted over a data communication medium or addressed (by rising addresses) in computer memory, counting only byte significance compared to earliness.





2-1. 빅 엔디언

빅 엔디언(Big Endian)은 가장 중요한 바이트(Most Significant Byte, MSB)가 가장 낮은 메모리 주소에 저장됩니다. 즉, 데이터의 큰 끝이 앞에 오는 것입니다.

A big-endian system stores the most significant byte of a word at the smallest memory address and the least significant byte at the largest.





빅 엔디언은 최상위 바이트부터 시작내림차순 으로 데이터를 저장합니다. 예를 들어, IP 주소 192.168.1.1 (0xC0A80101)을 네트워크상에서 전송할 때, 빅 엔디언 방식으로 전송하여, 0xC0, 0xA8, 0x01, 0x01 순으로 전송/저장하는 것입니다.

1
2
3
# IP 주소 192.168.1.1를 32bit로 표현(0xC0A80101)
address:     0x00 -> 0x01 -> 0x02 -> 0x03  
 value :     0xC0 -> 0xA8 -> 0x01 -> 0x01





이는 사람이 숫자를 읽는 순서와 동일하게 데이터를 저장하기 때문에 직관적이며, 네트워크 프로토콜, 인터넷 프로토콜(IP) 및 여러 파일 형식에서 사용됩니다.

1
2
3
# TCP/UDP 포트 80 (0x0050)
address:     0x00   0x01
 value :     0x00   0x50





2-2. 리틀 엔디언

리틀 엔디언(Little Endian) 방식은 가장 중요한 바이트(MSB)가 가장 높은 메모리 주소에 저장됩니다. 즉, 데이터의 작은 끝이 앞에 오는 것입니다. 인텔 x86 및 x86_64 아키텍처와 같은 많은 컴퓨터 아키텍처에서 사용됩니다. 작은 주소에서 큰 주소로 증가하는 방식으로 데이터에 접근할 때 효율적일 수 있습니다.

A little-endian system, in contrast, stores the least-significant byte at the smallest address.





예를 들어, 0x12345678을 가장 작은 바이트부터 가장 큰 바이트까지 아래와 같이 저장됩니다.

1
2
address:    0x00 <- 0x01 <- 0x02 <- 0x03
 value :    0x78 <- 0x56 <- 0x34 <- 0x12





여기에는 추가로 미들 엔디언(Middle Endian)이 존재하는데, 이는 빅 엔디언과 리틀 엔디언 외에 존재하는 별개의 형식으로, 32bit 데이터를 메모리에 bit 단위로 나누어 각 바이트를 저장하는 순서가 독특한 경우를 말합니다. 이를 사용하는 경우는 드물지만, 일부 하드웨어에서 사용됩니다.

Other orderings are generically called middle-endian or mixed-endian.







3. 엔디언 불일치


엔디언을 사용했을 때 크로스 플랫폼 데이터 전송에 문제가 존재할 수 있습니다. 시스템 간의 데이터 전송 시 엔디언 차이가 존재할 수 있기 때문입니다. 이를 위해서는 엔디언을 일치시키거나 별도로 변환하는 장치를 둬야 합니다.

  1. Network Byte Order: 네트워크 프로토콜은 데이터를 전송할 때, 빅 엔디언 형식을 사용합니다. 이는 네트워크 상 다양한 시스템이 서로 데이터를 교환할 때 일관성을 유지하기 위함입니다. 만약 시스템 간 엔디언 형식이 다를 경우, 이를 올바르게 해석하기 위한 변환이 필요합니다.
  2. Protocol Buffer: Google의 Protocol Buffers와 같은 직렬화 프레임워크는 플랫폼 간 데이터 전송을 위해 엔디언 문제를 추상화 합니다. 이는 데이터를 직렬화/전송할 때, 자동으로 이를 처리합니다.







4. 정리


엔디언의 정의와 몇 가지 예시, 발생할 수 있는 문제점을 살펴보았습니다. 그렇게 어려운 개념은 아닌데요, 데이터베이스 파일 포맷을 정의할 때 사용되더라고요. 정리한 개념을 바탕으로 어려운 부분까지 더 정리해 봐야겠습니다..


This post is licensed under CC BY 4.0 by the author.

SonarCloud 지표를 커스텀 해보자

서버의 포트 범위를 증가시키면 어떤 이점이 있을까?