Serach

2013년 10월 10일 목요일

엔디안 [ endian ]



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

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

빅 엔디안은 최상위 비트(MSB)부터 부호화되어 저장되며,
리틀 엔디안은 최하위 비트(LSB)부터 부호화되어 저장된다.
예를 들면, 숫자 12는 2진수로 나타내면 1100인데 빅 엔디안은 1100으로, 리틀 엔디안은 0011로 각각 저장된다.




바이트 순서 표식

바이트 순서 표식(Byte Order Mark, BOM)은 유니코드에서
엔디안을 구별하기 위해 사용되는 문자로, 문자 값은 U+FEFF이다.
UTF-16, UTF-32와 같은 인코딩에서는 엔디안의 종류에 따라 문자열의 값이 완전히 달라지므로,
문자열의 엔디안을 구별할 수 있는 표식이 필요하다.
이에 따라 유니코드 문자열 앞에 BOM 문자를 붙여, 맨 처음에 읽히는 값에 따라 엔디안을 구별한다.
예를 들어, UTF-16에서 빅 엔디안의 경우에 문자열의 가장 처음 두 바이트는 FE FF가 된다.
리틀 엔디안의 경우에는 FF FE가 된다.
UTF-8에는 엔디안 문제가 일어나지 않으므로 BOM을 붙여야 할 필요는 없지만,
해당 자료가 UTF-8 인코딩이라는 표식으로 사용하는 경우도 있다.

특히 마이크로소프트 윈도의 많은 문서 편집기는 UTF-8로 저장할 경우
자동으로 문서의 가장 앞부분에 BOM을 추가한다.
이와는 반대로 유닉스 계열의 문서 편집기는 BOM을 사용하지 않는 경우가 보통으로,
이 경우 문서의 BOM을 잘못 인식하여 문제가 발생할 수도 있다.

예를 들어, PHP 인터프리터에서는 BOM을 인식하지 못하고 일반 문자열로 간주하는데,
PHP에서 HTTP 헤더를 변경하려면 그 시점에서 어떠한 문자열도 출력해서는 안 된다.
하지만 문서에 BOM이 있으면 문자열 출력이 일어나고, 따라서 헤더를 변경할 수 없다는 경고가 발생하게 된다.


 Encoding
Representation 
 UTF-8
 EF BB BF
 UTF-16 (빅 엔디안)
 FE FF
 UTF-16 (리틀 엔디안)
 FF FE
 UTF-32 (빅 엔디안)
 00 00 FE FF
 UTF-32 (리틀 엔디안)
 FF FE 00 00
 SCSU
 0E FE FF
 UTF-EBCDIC
 DD 73 66 73
 BOCU-1
 FB EE 28

 




바이트 순서

바이트 순서는 크게 빅 엔디언과 리틀 엔디언으로 나눌 수 있다.
빅 엔디언은 사람이 숫자를 쓰는 방법과 같이 큰 단위의 바이트가 앞에 오는 방법이고,
리틀 엔디언은 반대로 작은 단위의 바이트가 앞에 오는 방법이다.
PDP-11과 같은 몇몇 아키텍처는 2바이트 단위와 1바이트 단위로 서로 다른 순서를 사용하기도 하는데
이들을 미들 엔디언이라 부른다. 다음은 이런 방법들을 비교한 것이다.

종류 
0x1234 의 표현 
 0x12345678
 빅 엔디안
 12 34
 12 34 56 78
 리틀 엔디안
 34 12
 78 56 34 12
 미들 엔디안
 -
 34 12 78 12 또는 56 78 12 34


두 방법 중 어느 한 쪽이 다른 쪽과 비교해 압도적으로 좋거나 나쁘지는 않다고 알려져 있으며,
두 방법은 서로 다른 여러 아키텍처에서 서로 공존하고 있다.
그러나 x86 아키텍처가 리틀 엔디언을 쓰기 때문에,
오늘날 x86 아키텍처를 사용하는 대부분의 데스크탑 컴퓨터는 리틀 엔디언을 쓰며 이를 ‘인텔 포맷’이라 한다.

거꾸로 네트워크에서는 주소를 빅 엔디언으로 쓰는데,
역사적으로 라우팅이 전화를 거는 식으로 접두 부호로 이루어졌기 때문이다.
이의 영향으로 많은 프로토콜과 몇몇 파일 포맷이 빅 엔디언을 사용하고 있다.

모토로라 프로세서들은 일반적으로 빅 엔디언을 사용하며,
ARM 프로세서들은 성능 향상을 위해 빅 엔디언과 리틀 엔디언을 선택할 수 있도록 되어 있다.




장단점 

빅 엔디언은 소프트웨어의 디버그를 편하게 해 주는 경향이 있다.
사람이 숫자를 읽고 쓰는 방법과 같기 때문에 디버깅 과정에서 메모리의 값을 보기 편한데,
예를 들어 0x59654148은 빅 엔디언으로 59 65 41 48로 표현된다.

반대로 리틀 엔디언은 메모리에 저장된 값의 하위 바이트들만 사용할 때
별도의 계산이 필요 없다는 장점이 있다.
예를 들어, 32비트 숫자인 0x2A는 리틀 엔디언으로 표현하면 2A 00 00 00이 되는데,
이 표현에서 앞의 두 바이트 또는 한 바이트만 떼어 내면 하위 16비트 또는 8비트를 바로 얻을 수 있다.
보통 변수의 첫 바이트를 그 변수의 주소로 삼기 때문에 이런 성질은 종종 프로그래밍을 편하게 하는 반면,

리틀 엔디언 환경의 프로그래머가 빅 엔디언 환경에서 종종 실수를 일으키는 한 이유이기도 하다.

댓글 없음:

댓글 쓰기