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
Respuesta
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.
Gracias Brian, supongo que Swig sin duda ayudará – Rohin
Puede usar DataInputStream
para cargar datos desde cualquier InputStream
. Siempre que sepa el diseño exacto de sus estructuras, esto debería ser suficiente.
java.nio tiene ByteBuffer, que permite cambiar el orden de los bytes al leer y escribir, sobre la marcha si es necesario.
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.
- 1. Uso de Struct Stat()
- 2. C struct struct declaration
- 3. Copiar struct to struct en C
- 4. Convertir C++ struct en C#
- 5. C struct en Python
- 6. Matriz en C struct
- 7. Struct. Herencia en C
- 8. tamaño de struct en C
- 9. XML to C struct y C struct to XML
- 10. C++ Struct herencia en Cython
- 11. Struct en C, ¿son eficientes?
- 12. defecto Struct inicialización en C++
- 13. Mariscal C++ gama struct en C#
- 14. Diferencias entre struct en C y C++
- 15. C matrices struct
- 16. C++ initialize anonymous struct
- 17. entendimiento C tamaño struct ++
- 18. C struct size alignment
- 19. Constructor C# Struct Genérico
- 20. C++: Devuelve NULL en lugar de struct
- 21. Obtener tamaño de struct en C#
- 22. Printf para struct? (C/C++, VC2008)
- 23. C/C++: Punteros dentro de Const Struct
- 24. actualización Struct en bucle foreach en C#
- 25. indefinido C struct declaración adelantada
- 26. C (++) struct force extra padding
- 27. ¿Por qué necesitamos struct? (C#)
- 28. Destruyendo un objeto struct en C#?
- 29. Void punteros a struct punteros en C
- 30. struct x vs x_t en C
¿Está usted por casualidad usando una red CAN? Si es así, el análisis del archivo DBC sería la mejor solución. – gramm
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