Java Delphi应用程序与android应用程序的Union通信

Java Delphi应用程序与android应用程序的Union通信,java,android,delphi,union,Java,Android,Delphi,Union,我创建了一个android应用程序,用于与另一个Delphi应用程序通信。delphi应用程序接受的数据是union。我使用UDP向它发送一个类型,该类型是我在创建my类时定义的。但是delphi应用程序接收的数据被错误地解释了。所以我想知道是否存在一种在java中实现联合类型的方法。 我已经看过了,但我不明白他对那门课做了什么 编辑:对不起,我只有我的代码,因为delphi应用程序是由另一个程序员创建的。但是我已经解决了这个问题。delphi应用程序希望字节按little endian排序,而

我创建了一个android应用程序,用于与另一个Delphi应用程序通信。delphi应用程序接受的数据是union。我使用UDP向它发送一个类型,该类型是我在创建my类时定义的。但是delphi应用程序接收的数据被错误地解释了。所以我想知道是否存在一种在java中实现联合类型的方法。 我已经看过了,但我不明白他对那门课做了什么

编辑:对不起,我只有我的代码,因为delphi应用程序是由另一个程序员创建的。但是我已经解决了这个问题。delphi应用程序希望字节按little endian排序,而我以big endian发送它们,因此在以这种方式用流序列化数据之后:

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){}
然后,我将CICLE的顺序颠倒如下:

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等等,因为最初的想法是发送一个my类的对象,但我通过wireshark看到序列化对象会带来一些信息,比如包的名称。所以我决定发送一个48字节的字节向量(是6个双字段)。我通过getPx(),getPy(),…,方法交叉选取这个字段。
但服务器中还有其他问题。但是对于这些问题,我将与delphi程序员讨论。

Java不支持在同一存储位置存储两种不同类型的值。在Lambda The Ultimate forum上给出的
other
类不是一个联合体,不像C和Pascal有联合体类型那样。C和Pascal允许您在一个字段中存储一个值并从另一个字段中读取,这样您就得到了一个隐式类型转换。论坛上显示的Java类允许您为union创建一个值,该值包含两种类型的值,但是一旦创建了
other
值,您就只能读取存储的值;无法从其他类型读取


要在运行时从套接字上的数据创建这样的值,您需要知道字段的类型。读取套接字中的值时,确定它是哪种类型,并创建正确类型的
other
子类(other.Left或
other.Right
)。序列化Java数据时,请调用
left
right
以获取当前值。

Java不支持在同一存储位置存储两种不同类型的值。在Lambda The Ultimate forum上给出的
other
类不是一个联合体,不像C和Pascal有联合体类型那样。C和Pascal允许您在一个字段中存储一个值并从另一个字段中读取,这样您就得到了一个隐式类型转换。论坛上显示的Java类允许您为union创建一个值,该值包含两种类型的值,但是一旦创建了
other
值,您就只能读取存储的值;无法从其他类型读取


要在运行时从套接字上的数据创建这样的值,您需要知道字段的类型。读取套接字中的值时,确定它是哪种类型,并创建正确类型的
other
子类(other.Left或
other.Right
)。序列化Java数据时,请调用
left
right
以获取当前值。

如何从Java类序列化数据?能否提供更多详细信息。没有代码,没有数据格式说明,也没有系统故障原因说明。如果没有这一点,问题就很难解决。它是“Union”还是“Unicode”?@mjn它肯定是
Union
,即Pascal术语中的变量记录。如何序列化Java类中的数据?能否提供更多细节。没有代码,没有数据格式说明,也没有系统故障原因说明。没有这一点,问题就很难解决。是“Union”还是“Unicode”?@mjn它肯定是
Union
,即Pascal术语中的变体记录。