티스토리 뷰

728x90

socket 통신을 통해 STT를 붙여야 하는 경우가 생겼다. 이전에도 여러번 socket으로 데이터를 주고 받은 적이 있기 때문에, 이 정도는 아무것도 아니지ㅋ 생각했는데, 업체로부터 제대로된 연동정의서가 아닌 C# 샘플 코드를 받았다. 흠 C#은 모르는데...?

다행히 샘플 코드가 어렵지 않아 Java로 포팅하면서, 제대로 했다고 생각했는데....계속 잘못된 결과를 받았다. 그치..한번에 잘 될 일이 없지..ㅎ 

 

그치만 아무리 봐도 뭐가 잘못인지 모르겠다.. 업체에 문의해봐도, 본인들도 그 결과는 처음본다고... 네..? 나에게 도움이 되는 답변은 아니었다.

그래서 수석님에게 도움을 요청하니, 코드의 문제는 아닌거 같고, 엔디안 문제 아니냐는 힌트를 주셨다.

 

엔디안이요? 와 완전 처음 들어보는 말..엉엉 그게 뭔데요ㅜㅜㅜ

 

엔디안 Endianness

엔디안은 컴퓨터 메모리에 데이터를 저장하는 방식 중 하나로, 바이트 순서를 의미한다.

 

Little Endian:

  • 가장 낮은 바이트(LSB, Least Significant Byte)가 메모리의 가장 낮은 주소에 저장되는 방식. 즉, 데이터의 바이트 순서를 역순으로 저장
  • 예를 들어, 4바이트 정수 0x12345678이 메모리에 저장될 때, Little Endian 방식에서는 다음과 같이 저장된다
주소: 00 01 02 03 
값 : 78 56 34 12

 

Big Endian:

  • 가장 높은 바이트(MSB, Most Significant Byte)가 메모리의 가장 낮은 주소에 저장되는 방식. 데이터의 바이트 순서가 정상적으로 저장
주소: 00 01 02 03
값  : 12 34 56 78
  • 네트워크 프로토콜(IP, TCP, UDP 등)은 Big Endian을 사용

내가 사용한 ByteBuffer 클래스를 보니 기본적으로 Big Endian은 사용한다고 한다. 

 

그리고 다시 C#의 샘플 코드를 살펴보니, BitConverter.GetBytes() 메소드를 사용한 곳이 있었다. 단순히 정수의 byte를 가져온다고 생각했는데...컴퓨터 아키텍쳐에 따라 리틀엔디안 혹은 빅엔디안으로 가져온단다...🫠

https://learn.microsoft.com/en-us/dotnet/api/system.bitconverter?view=net-8.0

 

BitConverter Class (System)

Converts base data types to an array of bytes, and an array of bytes to base data types.

learn.microsoft.com

 

 

어..그러면 나는..리틀엔디안으로 변환 할지 빅엔디안으로 변환할지 알수가 없는데.....ㅜㅜ

빅엔디안으로 했을 때 안되었으니까 리틀엔디안으로 하면 되겠지....쉽게 변경 할 수 있으니 그냥 변경해서 날려보자..

java의  ByteBuffer는 order() 메소드를 제공하여, 바이트의 순서를 설정 할 수 있다!

ByteBuffer buffer = ByteBuffer.allocate(4);
buffer.order(ByteOrder.LITTLE_ENDIAN); // 바이트 순서를 Little Endian으로 설정

 

순서를 변경해주고 다시 연동하니 원하는 결과값을 얻을 수 있었다.

 

결론

데이터를 송수신 할 때에는 엔디안이라는 것을 염두에 두어야한다! 외부에 연동 문서를 제공 할 때는, 당연하다고 생각되는 것도 적어주자..!

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
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
글 보관함