Связь между приложением Delphi и приложением Android с помощью Union

1

Я создал приложение Android для связи с другим приложением Delphi. Данные, которые принимает приложение delphi, являются union. Я отправляю с UDP ему тип, который я определил, создавая свой класс. Но данные, полученные приложением delphi, неправильно интерпретируются. Поэтому я хочу знать, существует ли метод для реализации типа объединения в java. Я уже смотрю этот http://lambda-the-ultimate.org/node/2694, но я не понимаю, что он делает с этим классом.

EDIT: Извините, но у меня есть только мой код, потому что приложение 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 и т.д., Потому что первоначальная идея заключалась в отправке объекта моего класса, но я вижу через wirehark, что объект serialize ведет с ним некоторую информацию, такую как имя пакета. Поэтому я решил отправить байтовый вектор из 48 байтов (было шесть двойных полей). Я выбираю это поле через метод getPx(), getPy(),..... Но есть и другие проблемы на сервере. Но для этих проблем я поговорю с программистом delphi.

  • 0
    Как вы сериализуете данные из вашего Java-класса?
  • 0
    Можете ли вы предоставить более подробную информацию. Там нет кода, нет описания формата данных и нет описания того, как ваша система отказывает. Без этого проблему очень трудно решить.
Показать ещё 2 комментария
Теги:
union

1 ответ

1

Java не поддерживает сохранение значений двух разных типов в одном хранилище. Either класс, данный на форуме Lambda Ultimate, не является объединением в том, что C и Pascal имеют типы объединения. C и Pascal позволяют хранить значение в одном поле и читать из другого поля, и вы получаете неявный тип. Класс Java показан на форуме позволяет создавать ценности для объединения, который содержит значение любого типа, но как только вы создали Either значение, вы можете читать только значение, которое хранится; вы не можете читать из другого типа.

Чтобы создать такое значение во время выполнения из данных в сокете, вам нужно знать тип поля. Когда вы прочитаете значение сокета, определите, какой тип он есть, и создайте Either подкласс соответствующего типа (либо Either.Left либо Either.Right). При сериализации данных Java вызовите либо left либо right чтобы получить текущее значение.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню