java - 使用Union在Delphi应用程序和android应用程序之间进行通信

标签 java android delphi union

我已经创建了一个 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.LeftEither.Right)。序列化 Java 数据时,调用 leftright 以获取当前值。

关于java - 使用Union在Delphi应用程序和android应用程序之间进行通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7711785/

相关文章:

python - 在 Python 中读取 Delphi 二进制文件

java - 确定在列表末尾 append 值的复杂性

delphi - COM 对象实例不知何故丢失

delphi - 是否有任何 Delphi 版本可以发出包含 tkUnknown 的 RTTI?

android - Android 中 contentProvider 查询中的 where 子句

java - 该方法和构造函数似乎作用于两个不同的传入/存储变量

Android:自 API 1.0 起删除了 DrivingDirections - 如何在 1.5/1.6 中执行?

java - jdbc 驱动程序仅在使用内存时有效

java - 如何将光标定位在默认位置?

java - 使用 writeReplace 进行 Corba 编码和代理