2009-08-17 8 views
12

Tengo que codificar un programa Java que recibirá mensajes de la red y mostrará su contenido al usuario. El problema es que los mensajes que recibo son simplemente volcados binarios de estructuras C. Añada a esto que algunos de los mensajes provienen de máquinas little endian y algunos de big endian sin que los campos se conviertan a orden de bytes de red. Una forma que tengo es usar JNI y convertir estructuras c en alguna cadena XML y luego serializar esta cadena XML a un objeto Java. Este es un trabajo laborioso ya que hay alrededor de 122 estructuras diferentes y cada una de ellas contiene más de 20 campos. Me pregunto si hay una biblioteca/herramienta/metodología que pueda hacer mi trabajo un poco fácil.Uso de C struct en Java

+0

¿Está usted por casualidad usando una red CAN? Si es así, el análisis del archivo DBC sería la mejor solución. – gramm

+0

Lamentablemente es un sistema de telecomunicaciones properiatrory. Estoy escribiendo una herramienta de depuración que dibujaría los mensajes intercambiados entre los módulos internos del sistema ... tipo de diagrama de flujo de llamadas. – Rohin

Respuesta

4

Swig manejará una gran cantidad de tedioso trabajo repetitivo para usted en términos de mapear las estructuras C para objetos Java. Consulte Swig/Java manual y la entrada en wrapping C structures.

+0

Gracias Brian, supongo que Swig sin duda ayudará – Rohin

4

Puede usar DataInputStream para cargar datos desde cualquier InputStream. Siempre que sepa el diseño exacto de sus estructuras, esto debería ser suficiente.

5

Hay varias bibliotecas que ayudan en esta área. Uno de los más simples de usar (driver de anotación) es ciertamente Preon

+0

doh, pásame. Necesito leer más detenidamente antes de redactar una larga respuesta –

+0

, pero tu respuesta es ** mejor ** – dfa

1

java.nio tiene ByteBuffer, que permite cambiar el orden de los bytes al leer y escribir, sobre la marcha si es necesario.

8

Hay una biblioteca llamada Preon que fue diseñada para ayudarte con este tipo de tarea: Preon site Básicamente, intentan mantener toda la lógica para leer tus pojo de la secuencia binaria en anotaciones vinculadas a cada campo en tu pojo.

Un ejemplo de sus documentos en el que controlar el tamaño de la int Usted está leyendo:

class Rectangle 
{ 
    @BoundNumber(size="16") private int x1; 
    @BoundNumber(size="16") private int y1; 
    @BoundNumber(size="16") private int x2; 
    @BoundNumber(size="16") private int y2; 
} 

o para especificar endianness:

class Rectangle 
{ 
    @BoundNumber(byteOrder=LittleEndian) private int x1; 
    @BoundNumber(byteOrder=LittleEndian) private int y1; 
    @BoundNumber(byteOrder=LittleEndian) private int x2; 
    @BoundNumber(byteOrder=LittleEndian) private int y2; 
} 

Incluso puede utilizar mini-ecuaciones con referencias a valores en campos anteriores para especificar tamaño/longitud, etc.

@BoundList(size="width * height") byte[] pixels; 
@BoundNumber(size="nrBits * 2") int value; 

Oh, y ellos a También ofrezco lógica condicional, todo en anotaciones.