본문으로 바로가기

빅엔디안, 리틀엔디안이란?

category Language/자바 2024. 6. 11. 14:29
728x90
반응형
SMALL

이기종간 시스템 연계

JAVA <-> C, C++..

상황

서로 네트워크 통신을 통해서 데이터를 주고 받는 상황

 

문제

사전에 정의된 포멧대로 데이터를 주고 받았으나

JAVA, C 각각의 시스템 단에서 포멧에 유효하지 않은 데이터들로 수신되기 시작

 

문제파악

데이터 포멧 예제

 
1.네트워크 패킷 확인

같은 데이터 포멧을 기준으로 서로 송신하는 테스트를 진행을 했다.

C -> JAVA

C에서는 데이터 타입 구분자3로 보낼것이며 이를 03 00 00 00 으로 저장하여 데이터를 송신한다.

실제 네트워크 패킷을 확인해보면 03 00 00 00 으로 확인되며, JAVA에서 데이터를 읽을때는 왼쪽부터 읽기 때문에 3,000,000이라는 엄청 큰 숫자로 인식하게 된다.

 

JAVA -> C

00 00 00 04 00 00
01 8f e5 bd e3 10 00 00 
00 03 40 42 13 2c 18 00
00 00 40 60 05 ee 29 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 41 41 52 36 30 33 33 30 78 37 31 63 33 35
39 00

JAVA에서는 데이터 타입 구분자를 4로 보낼것이며 이를 00 00 00 04로 저장하여 데이터를 송신한다.

실제 네트워크 패킷을 확인해보면 00 00 00 04로 확인되며, C에서는 데이터를 읽을때 오른쪽부터 읽기 때문에 40 00 00 00 그대로 읽고 결국 40,000,000 이라는 엄청 큰 숫자로 인식하게 된다.

 

이 문제를 해결하기 위해서는 우리는 엔디안이라는 개념을 알아야한다.

 

 

엔디안이란?

컴퓨터 시스템에서 데이터의 바이트 순서를 저장하는 방식이며, 빅엔디안, 리틀 엔디안 2가지 방식이 존재한다.

 

빅엔디안

리틀 엔디안

빅 엔디안은 첫 번째 주소에 가장 상위 비트인 0x01를 저장, 때문에 데이터를 읽을때는 왼쪽부터 읽는다.

리틀 엔디안은 첫 번째 주소에 가장 하위 비트인 0x04 를 저장, 때문에 데이터를 읽을때는 오른쪽부터 읽는다.

 

 

문제상황

같은 엔디안 사이에서의 통신은 문제 없다. 읽는 방식과 쓰는 방식이 똑같다.

img

 

다른 엔디안 사이에서의 통신일 경우 문제상황이 발생한다. 읽는 방식과 쓰는 방식이 아예 다르다.

img

리틀엔디안 에서는 0x12 0x34 데이터를 0x34 0x12로 저장하여 네트워크로 전송하고

빅엔디안에서는 0x34 0x12 수신하여 왼쪽부터 데이터를 0x34 0x12읽어들인다. 때문에 데이터를 잘못읽는 문제가 발생한다.

 

이런 상황 때문에 네트워크 통신에서 빅엔디안 방식이 표준이다.

 

 

그래서 본인의 시스템이 리틀 엔디안 방식인 경우에는

네트워크 통신을 했을때 꼭 빅엔디안 처리를 해야지만 나중에 이런 문제가 없다.

 

 

네트워크 통신 표준을 꼭 지키자!

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

참고: https://softtone-someday.tistory.com/20

https://bumukisbest.tistory.com/13

728x90
반응형
LIST