【问题标题】:Communication between Delphi application and android application using UnionDelphi应用程序和android应用程序之间使用Union进行通信
【发布时间】:2011-10-10 10:57:06
【问题描述】:

我创建了一个与另一个 Delphi 应用程序通信的 android 应用程序。 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 字节的字节向量(是 6 个双字段)。我通过 getPx(),getPy(),...., 方法选择了这个字段。 但是服务器中还有其他问题。但是对于这些问题我会和delphi程序员谈谈。

【问题讨论】:

  • 如何序列化 Java 类中的数据?
  • 您能否提供更多详细信息。没有代码,没有数据格式的描述,也没有关于系统如何失败的描述。没有这个问题就很难解决。
  • 是“Union”还是“Unicode”?
  • @mjn 肯定是union,即帕斯卡术语的变体记录。

标签: java android delphi union


【解决方案1】:

Java 不支持在同一存储位置存储两种不同类型的值。在 Lambda 终极论坛上给出的 Either 类不是 C 和 Pascal 具有联合类型的联合。 C 和 Pascal 允许您将值存储在一个字段中并从另一个字段中读取,并且您会获得隐式类型转换。论坛上显示的 Java 类允许您为包含任一类型值的联合创建一个值,但是一旦您创建了 Either 值,您就只能读取您存储的值;您无法从其他类型读取。

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

【讨论】:

    猜你喜欢
    • 2011-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-06
    相关资源
    最近更新 更多