티스토리 뷰

1. 바이트 순서 _ Little Endian 과 Big Endian


엔디안이란? (일부 출처)

컴퓨터의 메모리와 같은 1차워느이 공간에 여러 개의 연속된 대상을 배열하는 방법. 이 때,

바이트를 배열하는 방법을 바이트 순서(Byte order)라 한다.


빅 엔디안은 최상위 바이트(MSB - Most Signficant Byte) 부터 차례로 저장하며,

리틀 엔디안은 최 하위 바이트(LSB - Last Significant Byte) 부터 차례로 저장한다.


예를 들어, 메모리에 데이터를 저장한다고 가정해 보자. 


Double Word (4바이트) 형식의 데이터 0x 12 34 56 78을 메모리 주소 0x 00 00 01 00 에 넣는다.

이 때, Big endian 과 Little endian의 데이터를 넣는 순서는 다음과 같다.



빅 엔디안과 리틀 엔디안의 데이터 저장 순서가 서로 반대인 것을 알 수 있다. (리틀 엔디안이 데이터를 거꾸로 집어넣는다.)


빅 엔디안 : 메모리에 데이터를 최상위부터 최하위까지 차례대로 집어넣는다.

리틀 엔디안 : 메모리에 데이터를 최하위부터 최상위까지 거꾸로 집어넣는다.


! 메모리 주소 안에 들어가는 데이터에만 바이트 정렬이 사용되며, 레지스터에 저장되는 데이터에는 적용되지 않는다.


단, 이 메모리 정렬 기법은 어디까지나 바이트 순서에만 적용된다. 다시 말해, 리틀 엔디안에서 비트 단위까지 거꾸로 집어넣지는 않는다.

또한, x86 기반 시스템에서 2바이트(word), 4바이트(dword - 메모리 포인터) 크기의 데이터는 리틀 엔디안에서 메모리에 바이트 단위로 거꾸로 집어넣어지지만,

1바이트 크기의 데이터는 리틀 엔디안이나 빅 엔디안과 상관없이 동일하게 들어간다.


문자열의 경우에는 이러한 메모리 바이트 순서를 크게 걱정할 필요가 없다.

간단하게 ASCII 타입의 문자열을 예로 들어보자면, C++ 와 같은 언어에서는 기본적으로 1바이트 데이터 char를 연속적으로 배열로 선언하여 사용하게 된다. 즉,

1바이트 크기의 데이터들의 집합이 바로 문자열 형태이고, 결국 각각의 1바이트 데이터들은 바이트 순서에 영향을 받지 않게 되며, Java나 Python와 같은 언어에서는 stirng형식을 따로 제공하지만, 사실 내부적으로는 모두 char형태의 데이터들을 배열로 접근하여 사용한다.

크기가 2바이트인 유니코드와 euc-kr, 3바이트인 utf-8 문자의 경우도 내부적으로는 1바이트씩 접근하므로, 바이트 순서를 걱정하지 않아도 된다.

(예외적으로, 내부적으로 2바이트씩 읽는 utf-16과 3바이트씩 읽는 utf-32 문자열의 경우, 문자열 앞에 BOM(엔디안 확인용)을 붙여야 한다.)


현재 우리가 사용하는 대부분의 Intel CPU를 사용하는 컴퓨터는 모두 리틀 엔디안을 사용한다. (흔히 '인텔 포맷' 이라고 불리움)


네트워크에서의 바이트 순서

네트워크 통신에서는 IETF가 제정한 네트워크 바이트 순서(빅 엔디안)을 따르도록 지정되어 있다. 

C++ 와 같은 언어에서는 정수형과 같은 1바이트보다 큰 데이터를 전송할 때, hton(host to network) 와 같은 함수를 이용해 바이트 순서를 정렬해 전송해야 한다.

물론 이는 데이터를 받아 처리할 때도 마찬가지이다. (ntoh - network to host)

이 규약을 따르지 않게 되면, 엉뚱한 값을 받고 보낼 수 있기 때문에 네트워크에서의 바이트 순서는 중요하다.







사진 출처 :

http://genesis8.tistory.com/32

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함