본문 바로가기
프로그래밍/네트워크

빅 엔디언(Big Endian) 리틀 엔디언(Little Endian)에 대해서

by bantomak 2023. 8. 14.

엔디언(Endian)이란?

엔디언(Endian)은 컴퓨터의 메모리와 같은 1차원의 공간에 여러 개의 연속된 대상을 배열하는 방법을 뜻하며, 바이트를 배열하는 방법을 특히 바이트 순서(byte order)라고 한다.

엔디언은 보통 큰 단위가 앞에 나오는 빅 엔디언(Big-endian)과 작은 단위가 앞에 나오는 리틀 엔디언(Little-endian)으로 나눌 수 있으면, 두 경우에 속하지 않거나 둘을 모두 지원하는 것을 미들 엔디언(Middle-endian)이라 부르기도 한다.

 

빅 엔디언과 리틀 엔디언

biglitte

빅 엔디언(Big-endian)

큰 단위가 낮은 메모리 주소에 들어간다

 

리틀 엔디언(Little-endian)

큰 단위가 높은 메모리 주소에 들어간다.

 

  • 어느 한쪽이 압도적으로 좋거나 나쁘지 않음
    • 인텔 프로세서는 전통적으로 리틀 엔디언을 사용
    • 일반적으로 네트워크 주소는 빅 엔디언을 사용
  • 빅 엔디언은 저장 순서가 배열 선언하는 순서와 동일하다. (왼쪽에서 오른쪽으로 높아짐)
    • 프로그래머가 디버깅할 때 편리
  • 리틀 엔디언은 하위 바이트 값만 필요할 때 편리
  • CPU나 소프트웨어에 따라 두 방식을 선택해 사용

 

byteorder가 서로 반대인걸 확인할 수 있다.

 

C# 예제 코드

BitConverter.IsLittleEndian를 호출하면 현재 프로세서가 리틀엔디안을 사용하는지 확인이 가능하다.

리틀엔디안을 사용한다면 배열을 반전시켜주자.

 

static void Main(string[] args)
{
    byte[] bytes = { 0, 0, 1, 0 }; // 0 0 1 0

    if (BitConverter.IsLittleEndian) 
    {
        Console.WriteLine("Little Endian");
        Array.Reverse(bytes); // 0 1 0 0
    }
    else
    {
        Console.WriteLine("Big Endian");
    }

    int i = BitConverter.ToInt32(bytes, 0);

    Console.WriteLine(i); // 256
}

public byte[] EndianConvert(byte[] datas)
{
    byte[] arr = new byte[datas.Length];
    Array.Copy(datas, arr, datas.Length);

    Array.Reverse(arr);

    return arr;
}

댓글