2009-06-16 3 views
2

저는 일하는 곳에서 테스트 프로그램으로 문제를 물려받은 인턴입니다. 약간의 주위를 검색 한 후에 나는 똑같은 문제를 가진 사람을 찾을 수 있습니다. 여기에 약간의 질문을 한 후, 나는 이것을 게시 한 사람이 실제로 여전히 여기에서 일한다는 것을 알았고 나는 이것에 대해서도 그의 도움을 얻고있다. 그러나 나는 그가 내가하는 것보다 좀 더 우스꽝스럽게 문제를 설명한다고 생각한다. 여기 Java/Ada 빅 엔디 언에서 리눅스로 Little Endian 문제

on this forum

은 모든 쓰레기를 읽을 수 없다 분들을위한 그것의 JIST입니다. 우리는 클라이언트 측에서 실행되는 GUI를 가지고 있으며 SPARC Unix 시스템에서 실행되는 Ada로 작성된 테스트 응용 프로그램에 대한 원격 호출을 수행합니다. 건물의 모든 사람들이 유닉스 머신을 사용하여 모든 것을 처리 할 때, 테스트 응용 프로그램과 GUI는 정상적으로 작동했지만 최근에는 모두 최신 x86 시스템이 더 빨라졌습니다.

테스트 앱과 GUI 간의 Big/Little Endian 비 호환성으로 인해 업그레이드를받은 사용자는 테스트 앱을 실행할 수 없습니다.

이제는 문제를 해결하는 방법을 찾아야합니다. 자, 여기서 큰 재 작성이 될 것이라는 것을 알고 있으며 GUI와 테스트 애플리케이션이 어떻게 서로 이야기하는지 다시 정의해야 할 것입니다. 그러나 프로그램을 완전히 분해하지 않고 어떻게 할 수 있습니까? 자바 RMI XML/RPC SOAP 데이터 굽기 다음과 같이

나 자신과 함께 제공되는 옵션 중 일부는

은?

네트워크 프로그래밍에 대한 전적으로 멍청한 생각이 들지만 이러한 "솔루션"이 나에게 맞는 것처럼 보일지라도 나는 완전히 근본이 아닐 수도 있습니다. 도와주세요!

+0

엔딩이 실제로 문제인지 어떻게 확인 했습니까? – Eddie

+0

@ Eddie - 아직 실제로 확인하지 않았습니다. 나는 그 프로그램에 종사 한 마지막 사람의 말을하려고합니다. 나는 사람들이 계속해서 일하도록하고 있다고 생각하지만, 다른 프로젝트를 위해 사람들을 끌어 들이고있다. –

+0

@Eddie : * 문제 *가 아닌 경우 certianly * a * 문제입니다. 이 두 시스템은 다른 엔디안 니스를 가졌습니다. 바이트 순서 *는 데이터를 전송하고 계정을 고려하지 않으면 잘못 될 것입니다. –

답변

1

아무 것도 다시 쓸 필요가 없습니다. 양쪽에 네트워크 주문 (빅 엔디안, 자연스럽게 숫자를 나타내는 방식)을 사용하는지 확인하십시오. x86은 리틀 엔디안을 사용하므로 x86에서 실패한 응용 프로그램의 소스 코드를 살펴 봐야합니다.

그런 다음 htonl/htons/ntohl/ntohs (man 3 htonl 참조) 또는 비슷한 기능을 사용하여 보내거나받는 모든 숫자를 데이터를 보내고받는 코드 부분에서 올바른 인코딩으로 변환하십시오. Java는 항상 네트워크 순서를 사용하므로 원시 Java 코드에 대해 걱정할 필요가 없습니다.

+0

답변 해 주셔서 감사합니다! 불행히도 나는 지금 지금 더 혼란 스럽다. Java가 LE 시스템에서 실행 중이며 Ada 코드가 BE 시스템에서 실행 중이므로 모든 것이 잘 작동해야합니다. 드로잉 보드로 돌아 가기. –

+2

@Andy Java 코드가 JNI를 사용합니까? 엔디안이 문제인지 확신합니까? 그렇다면, 어떤 엔디안이 유선에 사용되는지 우리에게 말해 줄 수 있어야합니다. 조언 : wireshark와 디버거를 사용하여 GUI와 서버의 네트워크 구성 요소에 익숙한 사람에게 물어보십시오. – phihag

+0

@phihag JNI가 사용되지 않았고 endianess가 문제가되는지 100 % 확신하지 못합니다. 나는 마지막 녀석에게서이 문제에 대해 연구했다. 제안 해줘서 고마워. 나는 그것을 설정하고 내가 알아낼 수있는 것을 보도록 확실히 노력할 것입니다. –

0

정말 무거운 솔루션을 찾고 있습니다. (FYI : 또 다른 무거운 해결책은 ASN.1 임).

맞춰야 할 데이터에 대해 바이트 스왑을 수행하기 위해 한쪽 (아마 테스트 응용 프로그램)에 코드를 추가하면됩니다.

물론 까다로운 부분은 (일반적으로) 바이트를 스왑 할 수 없다는 것입니다. 을 알고 있어야합니다. 데이터는 두 개의 2 바이트 정수가 동일한 주소의 단일 4 바이트 정수와 다르게 스왑 될 필요가 있기 때문입니다. 문자 데이터는 전혀 교환되지 않습니다.

가능한 쉬운 해결 방법 : 당신이 당신의 에이다 컴파일러로 모기를 사용하는 경우 (이미 그렇게하지 않은 경우), 하나의 옵션이 스트림을 사용하는 데이터 전송 코드를 다시 작성하는 것, 쓰기 리눅스의 일부 Ada 코드는 스트림을 사용하여 읽습니다. 그런 다음 XDR 버전의 Ada 스트림을 사용하도록 수정하십시오 (자세한 내용은 herehere). Gnat의 스트림의 XDR 버전은 자동으로 바이트 스왑을 처리합니다.

관련 문제