2011-10-10 2 views
1

다른 Delphi 응용 프로그램과 통신 할 수있는 Android 응용 프로그램을 만들었습니다. 델파이 애플리케이션이 받아들이는 데이터는 합집합입니다. UDP를 사용하여 클래스를 작성하도록 정의한 유형을 전송합니다. 그러나 델파이 애플리케이션이받는 데이터는 잘못 해석됩니다. 그래서 자바에서 유니온 타입을 구현하는 메소드가 있는지 알고 싶습니다. 나는 이미 이걸 http://lambda-the-ultimate.org/node/2694로 보았지만, 그 수업에서 그가 무엇을하는지 이해하지 못합니다.Union을 사용하는 Delphi 응용 프로그램과 Android 응용 프로그램 간의 통신

편집 : 죄송 합니다만, 델파이 응용 프로그램이 다른 프로그래머에 의해 작성 되었기 때문에 제 코드가 있습니다. 그러나 나는 문제를 해결했다. 다음

ByteArrayOutputStream baos=new ByteArrayOutputStream(); 
DataOutputStream dos=new DataOutputStream(baos); 
try{ 
    dos.writeLong(Double.doubleToRawLongBits(x)); 
    dos.flush(); 
    px=baos.toByteArray(); 
    baos.reset(); 
    dos.writeLong(Double.doubleToRawLongBits(y)); 
    dos.flush(); 
    py=baos.toByteArray(); 
    baos.reset(); 
    dos.writeLong(Double.doubleToRawLongBits(z)); 
    dos.flush(); 
    pz=baos.toByteArray(); 
    baos.reset(); 
    dos.writeLong(Double.doubleToRawLongBits(a)); 
    dos.flush(); 
    ga=baos.toByteArray(); 
    baos.reset(); 
    dos.writeLong(Double.doubleToRawLongBits(b)); 
    dos.flush(); 
    gb=baos.toByteArray(); 
    baos.reset(); 
    dos.writeLong(Double.doubleToRawLongBits(c)); 
    dos.flush(); 
    gc=baos.toByteArray(); 
    baos.reset(); 
}catch(Exception e){} 

내가 이들과 같은 cicles에 대한 몇 가지와 순서를 거꾸로 한 : 나는 큰 엔디안 그들은을 전송하는 동안 델파이 응용 프로그램은 바이트 그래서 이후 이런 식으로 스트림 데이터를 직렬화, 리틀 엔디안으로 정렬 구함 :

ByteBuffer bb = ByteBuffer.allocate(48); 
//bb.order(ByteOrder.LITTLE_ENDIAN); 
for(int i=7;i>=0;i--) 
    bb.put(messaggio.getPx()[i]); 
for(int i=7;i>=0;i--) 
    bb.put(messaggio.getPy()[i]); 
for(int i=7;i>=0;i--) 
bb.put(messaggio.getPz()[i]); 
for(int i=7;i>=0;i--) 
bb.put(messaggio.getGa()[i]); 
for(int i=7;i>=0;i--) 
bb.put(messaggio.getGb()[i]); 
for(int i=7;i>=0;i--) 
bb.put(messaggio.getGc()[i]); 
byte[] messbyte=bb.array(); 

당신은 너무에 messaggio.getPx 및 참조 초기 아이디어는 내 클래스의 전송 대상이었다,하지만 난 Wireshark를 통해 볼 수 있기 때문에 그 그와 함께 직렬화 객체 리드 패키지의 이름과 같은 몇 가지 정보를 제공합니다. 그래서 48 바이트의 바이트 벡터를 전송하기로 결정했습니다 (6 개의 이중 필드였습니다). 나는이 필드를 getPx(), getPy(), ...., 메소드를 통해 선택한다. 하지만 아직 서버에 다른 문제가 있습니다. 그러나 이러한 문제들에 대해서는 델파이 프로그래머와 이야기 할 것입니다.

+0

Java 클래스의 데이터를 어떻게 직렬화합니까? – Robert

+0

몇 가지 세부 정보를 제공 할 수 있습니까? 코드가 없으며 데이터 형식에 대한 설명이없고 시스템 오류에 대한 설명도 없습니다. 이것 없이는 문제를 해결하기가 대단히 어렵습니다. –

+0

"유니언"또는 "유니 코드"입니까? – mjn

답변

1

Java는 동일한 저장 위치에 두 가지 유형의 값을 저장할 수 없습니다. Lambda the Ultimate 포럼에서 주어진 Either 클래스는 C와 Pascal이 공용체 유형을 가지고있는 방식으로 결합되어 있지 않습니다. C와 Pascal을 사용하면 하나의 필드에 값을 저장하고 다른 필드에서 값을 읽을 수 있으며 암시 적 타입 캐스트를 얻을 수 있습니다. 포럼에 표시된 Java 클래스를 사용하면 두 유형 중 하나의 값을 보유하는 유니온의 값을 만들 수 있지만 일단 Either 값을 만들면 저장된 값만 읽을 수 있습니다. 다른 유형은 읽을 수 없습니다.

소켓의 데이터에서 런타임에 이러한 값을 만들려면 필드 유형을 알아야합니다. 소켓에서 값을 읽을 때 형식이 무엇인지 결정하고 적절한 형식 (Either.Left 또는 Either.Right)의 하위 클래스 Either을 만듭니다. Java 데이터를 직렬화 할 때 left 또는 right을 호출하여 현재 값을 가져옵니다.

관련 문제