티스토리 뷰
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
어..그러면 나는..리틀엔디안으로 변환 할지 빅엔디안으로 변환할지 알수가 없는데.....ㅜㅜ
빅엔디안으로 했을 때 안되었으니까 리틀엔디안으로 하면 되겠지....쉽게 변경 할 수 있으니 그냥 변경해서 날려보자..
java의 ByteBuffer는 order() 메소드를 제공하여, 바이트의 순서를 설정 할 수 있다!
ByteBuffer buffer = ByteBuffer.allocate(4);
buffer.order(ByteOrder.LITTLE_ENDIAN); // 바이트 순서를 Little Endian으로 설정
순서를 변경해주고 다시 연동하니 원하는 결과값을 얻을 수 있었다.
결론
데이터를 송수신 할 때에는 엔디안이라는 것을 염두에 두어야한다! 외부에 연동 문서를 제공 할 때는, 당연하다고 생각되는 것도 적어주자..!
'백엔드 > java' 카테고리의 다른 글
[java] null 대신 Optional 클래스 (0) | 2024.09.18 |
---|---|
[java] 신뢰할 수 없는 인증서(사설인증서)를 사용 할 수 있도록 jvm 설정하기/PKIX path building failed (0) | 2024.06.10 |
[자바] 객체를 더 객체답게 사용하기 - 상속(Inheritance) (1) | 2023.12.26 |
[java/자바] try-with-resource 구문 / 자원 자동 반납 (0) | 2023.08.03 |
[java/자바] 익명내부 클래스를 람다식으로 변경하기 (0) | 2023.07.25 |
- Total
- Today
- Yesterday
- 도커
- 현대오토에버
- 코딩테스트
- 현대
- 전자정부프레임워크
- 현대코테
- Linux
- 아파치카프카
- tomcat
- mysql
- 자바코테
- softeer java
- 코테
- 리액트
- 자바
- javascript
- java 코테
- 스프링
- 쿠버네티스
- Kubernetes
- react
- Docker
- 톰캣
- 자바스크립트
- Spring
- springboot
- java
- centos
- softeer
- 오토에버코테
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |