我已经创建了一个 android 应用程序来与另一个 Delphi 应用程序进行通信。 delphi 应用程序接受的数据是union。我用 UDP 向它发送一个我定义的创建我的类的类型。但是 delphi 应用程序收到的数据被错误地解释了。所以我想知道是否存在在 java 中实现联合类型的方法。 我已经看过这个http://lambda-the-ultimate.org/node/2694 ,但我不明白他用那个课做了什么。
编辑:抱歉,但我只有我的代码,因为 Delphi 应用程序是由另一位程序员创建的。但是我已经解决了这个问题。 Delphi 应用程序希望字节按小端顺序排列,而我以大端方式发送它们,所以在以这种方式用流序列化数据之后:
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 字节的字节 vector (是六个双字段)。我通过 getPx(),getPy(),...., 方法选择这个字段。 但是服务器中还有其他问题。但是对于这些问题,我会和delphi程序员谈谈。
最佳答案
Java 不支持在同一存储位置存储两种不同类型的值。在 Lambda the Ultimate 论坛上给出的 Either
类不是 C 和 Pascal 具有联合类型的联合。 C 和 Pascal 允许您在一个字段中存储一个值并从另一个字段中读取,并且您得到隐式类型转换。论坛上显示的 Java 类允许您为联合体创建一个值,该联合体包含任一类型的值,但是一旦您创建了 Either
值,您就只能读取您存储的值;你不能从其他类型读取。
要在运行时根据套接字上的数据创建这样的值,您需要知道字段的类型。当您从套接字读取值时,确定它是哪种类型并创建适当类型的 Either
子类(Either.Left
或 Either.Right
)。序列化 Java 数据时,调用 left
或 right
以获取当前值。
关于java - 使用Union在Delphi应用程序和android应用程序之间进行通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7711785/