Отправка структуры C++ через UDP в Java

Я программист на C++ и мне нужно настроить некоторые UDP-связи между приложением java android и сервером C++, работающим на ПК.

у меня есть структура, которую мне нужно получить на ПК, которая состоит из следующего:

int
int
float

к сожалению, я совершенно не понимаю, как я могу это сделать с Java.

мне нужно создать DatagramPacket, но конструктор принимает только массив байтов. Теперь с C++ это будет простой переход от структуры к пеструшка.* Однако кастинг, подобный этому, невозможен с Java.

Я создал простой класс, в котором есть вышеуказанные поля. Кажется, все в порядке. Моя оставшаяся проблема заключается в том, как превратить это в массив байтов. Может ли кто-нибудь помочь Java noob на этом фронте?

Ура!

Edit: я создал функцию в классе, которая делает следующее

        public byte[] GetBytes() throws IOException
        {
            ByteArrayOutputStream   byteOut = new ByteArrayOutputStream();
            DataOutputStream        dataOut = new DataOutputStream( byteOut ); 
            dataOut.writeInt( Integer.reverseBytes( int1) );
            dataOut.writeInt( Integer.reverseBytes( int2 ) );
            dataOut.writeFloat( float1 );

            return byteOut.toByteArray();
        }

есть ли лучший способ сделать это?

Я бы предпочел не использовать протокол google буфер упоминается в ответе Стива, потому что, хотя это интересно, это потребует слишком много изменений в других реализациях платформы, которые я бы предпочел не делать.

2 ответов


можно использовать буферы протокола Google как независимый от языка способ сериализации структур для передачи и приема. Как Java, так и C++ доступны из коробки, и Джон Скит написал готовую к производству реализацию C#.

Я вижу несколько примеров использования Protobuf на Android, в том числе этой.


другой, возможно, более простой подход исходит из Javolution.struct:http://javolution.org/target/site/apidocs/javolution/io/Struct.html

 public static class Student extends Struct {
     public final Enum32<Gender>       gender = new Enum32<Gender>(Gender.values());
     public final UTF8String           name   = new UTF8String(64);
     public final Date                 birth  = inner(new Date());
     public final Float32[]            grades = array(new Float32[10]);
     public final Reference32<Student> next   =  new Reference32<Student>();
 }
class UDPMessage extends Struct {
      Student student = inner(new Student());
      ...
 }
 ...
 public void run() {
     byte[] bytes = new byte[1024];
     DatagramPacket packet = new DatagramPacket(bytes, bytes.length);
     UDPMessage message = new UDPMessage();
     message.setByteBuffer(ByteBuffer.wrap(bytes), 0);
     // packet and message are now two different views of the same data.
     while (isListening) {
         multicastSocket.receive(packet);
         int xxx = message.xxx.get();
         ... // Process message fields directly.
     }
 }

довольно уродливый кусок кода, но все же красивее, чем иметь дело непосредственно с буферами JNI или уже упомянутыми буферами протокола Google.