본문 바로가기

iOS/iOS

iOS) 메모리 저장 방식 - Big Endian / Little Endian

 

안녕하세요 :) 소들입니다!!!!!!!!!!!!!

오늘은 메모리 저장 방식에 대해 포스팅을 해보려고 합니다!!!

 

말이 거창하지 사실  Big Endian과 Little Endian 이 얘기임ㅎㅎㅋ

네트워크 수업을 들었다면 누구나 다 알겠지만

나는 신나게 졸던 학생이었기에 따로 포스팅을 합니다 

 

사실 iOS에선 어떤 방식으로 저장하는지 궁금하지 않나연?

 

근데 메모리 확인하며 하기에는 Swift보다 Objective-C가 편해서..

(C언어를 사용할 것이기 때문에.........)

 

이번 포스팅은 Objective-C로 확인할 예정입니다!!!

근데 뭐 몰라도 상관 없을듯 

 

모든 포스팅은 편의 말투로 합니다~!!

 

 

 

 

1. 바이트 오더 (Byte Order)

 

먼저 Byte Order라는 것에 대해 알고갈 것임

여러분 컴퓨터에서 메모리에 저장되는 가장 작은 단위는

 

1Byte (8bit)

 

잖음??

자, 만약 한 글자가 1Byte이고,

이때 "안녕하세요"를 메모리에 저장한다고 가정하면,

 

 

 

 

낮은 주소 ▶ 높은 주소

어쩌면 당연한 생각으론 위처럼 순서대로 저장된다고 생각할 것임

 

물론 실제 위처럼 저장할 수도 있지만,

어떤 운영체제에선 이를 반대로 저장하는 곳도 있음

(우리 나라와 일본의 만화책 읽는 방향이 정 반대인 것 처럼)

 

 

 

 

높은 주소 ▶ 낮은 주소

이렇게 말이징 ㅎㅎ; 이처럼 컴퓨터는 데이터를 저장할 때 

 

Byte : 컴퓨터에 저장되는 최소 단위인 1Byte를

Order :  순서대로 왼쪽부터 읽어서 저장하느냐, 반대로 오른쪽부터 읽어서 저장하느냐

 

에 따라 방식이 달라지는데 이것을 Byte Order 라고 하는 것임!!!

 

Byte Order에는 크게 Big Endian 방식과 Little Endian 방식이 있음!!!

이는 2Byte 이상의 데이터를 저장할 때의 차이임 (1Byte만 있다면 저장 순서가 상관 없으니!)

middle Endian도 있지만 안 다룰 것임)

 

 

 

 

2. Big Endian 방식

 

Big Endian 방식은

 

데이터를 메모리에 저장할 때, 큰 단위가 앞에오게끔 저장하는 방식

 

큰 단위가 앞에 온다고 해서 "Big" 이란 단어가 들어간 것...

아까 Byte Order에서 살펴보면

 

 

 

 

이 방식이 바로 Big Endian임...

 

...??

낮은 주소 ▶ 높은 주소

순으로 저장하는데 왜 큰 단위가 앞에 와서 Big Endian이라는 것임??

 

이라는 궁금증이 생길 수 있는데

위 예제가 아닌 숫자 예제로 보면 이해할 수 있음!!!

 

우리가 만약 0x1234이라는 16진수를 메모리에 저장한다면,

Big Endian이라면 

 

 

 

 

이렇게 저장한다는 말이잖음!?!?

(16진수는 4bit이기 때문에, 1Byte에 2개씩 할당되는 것임)

 

근데 0x1234라는 16진수를 2진수로 표현하면

 

 

 

 

이렇게 될 것이고

0x 다음에 처음 오는 숫자(1)가 가장 큰 단위가 되기 때문에

(최상위비트부터 시작하는)

 

이 관점에서 봤을 때,

Big Endian은 '1'이라는 가장 큰 단위부터 맨 앞에 오게끔 저장하기 때문에,

 

 

 

 

요롷게!! 

상위비트, 하위비트 관점에서 봤을 때 큰 단위가 앞에 오기 때문에 Big Endian이라는 것임!!!

이해가 되셨길 👀

 

 

 

 

3. Little Endian 방식

 

Little Endian 방식은

 

데이터를 메모리에 저장할 때, 작은 단위가 앞에오게끔 저장하는 방식

 

작은 단위가 앞에 온다고 해서 "Little" 이란 단어가 들어간 것...

위에서 Big Endian을 제대로 이해했으면, 전혀 어렵지 않음

 

왜냐? Big Endian의 정 반대거든!!

아까 예제로 본다면

 

 

 

 

바로 요론 그림임 ㅎㅎ

0x1234로 생각해보면

 

 

 

 

가장 작은 단위부터 앞에 저장하기 때문에,

Little Endian인 것임

 

 

 

 

4. 언제 Big Endian을 쓰고, 언제 Little Endian을 쓸까요?

 

이제 이 둘의 사용처에 대해 알아볼 것임

Endian 방식은 전형적으로 CPU 방식에 의해 결정나는데,

 

  Big Endian Little Endian
장점 - 숫자 비교가 빠르다
- 소프트웨어 디버그가 편하다

- 수학적 연산이 쉽다
- 타입을 읽거나 형변환 하는 데 빠르다

단점 - 수학적 연산이 어렵다
- 타입을 읽거나 형변환 하는 게 느리다

- 숫자 비교가 느리다
- 소프트웨어 디버그가 불편하다

 

서로 장단점이 반대임 ㅎㅎㅎ

보통 저런 장단점 중 자신에게 필요한 Endian을 결정해서 사용하는 듯

왜 이런 장단점이 있는진 나중에 시간되면 다뤄보겠음 ㅠㅠ

 

 

 

 

5. Network Byte Order

 

자, 만약 통신을 한다고 할 때 

A 컴퓨터는 Big Endian을 사용하고, B 컴퓨터는 Little Endian을 사용한다면

서로 데이터를 주고 받을 때 문제가 되지 않겠음!?!?

 

따라서 

 

네트워크 상에서 데이터를 전송할 땐 네트워크 바이트 오더를 따라야 한다

 

라는 규칙이 있음!!!

또한 이 네트워크 바이트 오더의 가장 흔한 포맷이

 

Big Endian

 

임!!!

TCP, UDP, IPv4, IPv6 등 많은 프로토콜들이 모두 Big Endian을 사용함

 

따라서, 만약 내 컴퓨터가 Little Endian이다~ 하면

서버에서 데이터를 전송할 때 Big Endian으로 변환하는 작업을 해줘야 함

 

 

 

 

6. Big Endian <-> Little Endian

 

Big Endian과 Little Endian을 변형시키는 함수는

 

 

6-1. Little Endian -> Big Endian

 

htons (host to network short) : short 메모리 값을 호스트 바이트 순서에서 네트워크 바이트 순서로 바꿈

htonl (host to nework long) : long 메모리 값을 호스트 바이트 순서에서 네트워크 바이트 순서로 바꿈

 

 

6-2. Big Endian -> Little Endian

 

htons (host to network short) : short 메모리 값을 네트워크 바이트 순서에서 호스트 바이트 순서로 바꿈

htonl (host to nework long) : long 메모리 값을 네트워크 바이트 순서에서 호스트 바이트 순서로 바꿈

 

 

이런 것들이 있음

C언어 기준이지만, Objective-C에서도 사용 가능함!!

 

 

 

 

7. iOS는 Big Endian? Little Endian?

 

으.. 이 질문까지 오는데 정말 길고 길었다 😱

그렇다면 우리의 iOS는

메모리 저장할 때 Big Endian으로 저장할지 Little Endian으로 저장할지

궁금하지 않음??

 

Objective-C로 직접 실험해보겠음 (C 코드를 쓸 것이기 때문에)

간단히 Big Endian인지 Little Endian인지 알아보는 코드를 작성하면 되는데,

 

 

int num = 1;
char *ptr = &num;
        
if(*ptr == 1){
    NSLog(@"LITTLE ENDIAN");
}else{
    NSLog(@"BIG ENDIAN");
}

 

 

이런 식으로 확인하면 됨

코드를 간략히 설명하자면, num은 4Byte이기 때문에

 

 

 

 

Big Endian일 때와 Little Endian일 때 각각 위 그림처럼 저장 되어 있을 거임

근데 이제 1Byte 크기의 ptr 포인터 변수를 선언해서 num의 첫 번째 Byte를 가리키게 하는 것임

 

 

 

 

요롷게

만약 Big Endian이면 *ptr의 값이 0일테고,

Little Endian이면 *ptr의 값이 1이 나올 것임

 

이렇게 간단하게 확인할 수가 있음 ㅎㅇㅎ

실제로 코드를 돌려보면,

 

 

 

 

Little Endian이 출력됩니다~~~

네 그렇습니다~~~~~~~~~~~~ 

 

iOS는 Little Endian으로 데이터를 저장함

 

따라서, 만약 아주 Low Level로 통신해야 하는 경우면

네트워크 바이트 오더로 변경하는 작업을 꼭 해주셔야 함!!!!!

 

 

 

 

.

.

.

 

휴... 이포스팅을 왜했냐면..

예전에  서버한테 받은 데이터를 Little Endian으로 바꿔주는 작업 안했다가

호되게 혼난 적이 있어서.... (매우 Low Level)

 

쨌든 다시 돌아보고 정리하니까 좋네염 :)

잘못된 점이나 피드백 환영!!!!!!

 



Calendar
«   2024/04   »
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
최근 댓글
Visits
Today
Yesterday