C estructura escrita en archivo, abierta con Java

Por ejemplo en CI tenemos estructura:

typedef struct { int number; double x1; double y1; double x2; double y2; double x3; double y3; } CTRstruct;` 

Luego lo escribo en el archivo fwrite(&tr, 1, sizeof(tr), fp); (tr – es CTRstruct var, fp – Puntero a archivo);

¡Entonces necesito leerlo con Java! Realmente no sé cómo leer la estructura del archivo … Intenté leerlo con ObjectInputStream() , la última idea es leer con RandomAccessFile() pero tampoco sé cómo … ( readLong(), readDouble() tampoco funciona, funciona de origen pero no lee datos correctos). Entonces, ¿alguna idea de cómo leer C struct desde un archivo binario con Java?


Si es interesante, mi versión para leer entero (pero es fea, y no sé qué hacer con el double ):

La clase pública MyDataInputStream extiende DataInputStream {

 public MyDataInputStream(InputStream AIs) { super(AIs); } public int readInt1() throws IOException{ int ch1 = in.read(); int ch2 = in.read(); int ch3 = in.read(); int ch4 = in.read(); if ((ch1 | ch2 | ch3 | ch4) < 0) throw new EOFException(); return ((ch4 << 24) + (ch3 << 16) + (ch2 << 8) + (ch1 << 0)); } 

con el doble podemos tratar de la misma manera (como con int o con long (8bytes) y luego convertir al doble con func nativo).

Debe averiguar qué tamaño de esos tipos de C (int, doble) y qué endianness (gracias andrew cooke) se utilizan en la architecture en la que ejecutó el progtwig y usar tipos del mismo tamaño en Java.

No debe usar fwrite de toda la struct , porque inevitablemente se encontrará con problemas con el relleno y el estado de endian . El lado C volcará toda la struct como está en la memoria, con todos los huecos que el comstackdor pone para el rendimiento, etc. ¡Esa es la “madre de la no portabilidad”!

En su lugar, debe usar búferes de protocolo, JSON o algún otro medio de serialización portátil para realizar su tarea.

Use una biblioteca que serialice sus datos en el disco . Eso hará que la lectura de nuevo en Java sea mucho más fácil. Asegúrese de que la biblioteca utiliza un formato de almacenamiento bien documentado.

DataInputStream es la forma típica de leer entradas primitivas en Java: creo que deberías poder hacerlo

 int number = dataInputStream.readInt(); double x1 = dataInputStream.readDouble(); ... double y3 = dataInputStream.readDouble(); 

pero no estoy 100% seguro de que el endianness y otras cuestiones sean compatibles.

Bueno, en el improbable caso de que JNI sea una opción para usted, podría leerlo nuevamente en C. Usando un gulp , podría exponer fácilmente su estructura, junto con su función para leer del archivo. Por supuesto, toda la molestia que viene con JNI no vale la pena solo por este problema, pero es posible que ya lo esté utilizando.