Actualmente, estoy guardando y cargando algunos datos en estructuras C/C++ a archivos usando fread()/fwrite(). Esto funciona bien cuando se trabaja con esta única aplicación C (puedo recompilar cada vez que la estructura cambia para actualizar los argumentos de sizeof() a fread()/fwrite()), pero ¿cómo puedo cargar este archivo en otros programas sin saber de antemano? el tamaño de() s de la C struct?La mejor manera de serializar una estructura C para ser deserializada por Java, etc.
En particular, he escrito esta otra aplicación Java que visualiza los datos contenidos en ese archivo binario C struct, pero me gustaría una solución general sobre cómo leer ese archivo binario. (En lugar de tener que poner manualmente el tamaño de() s en la fuente de la aplicación Java cada vez que cambia la estructura C ...)
Estoy pensando en serializar texto o XML de algún tipo, pero estoy no estoy seguro de por dónde empezar (cómo serializar en C, cómo deserializar en Java y posiblemente en otros idiomas en el futuro), y si es aconsejable aquí, donde un miembro de la estructura es una matriz flotante que puede ir más allá de ~ 50 MB en formato binario (y tengo cientos de estos archivos de datos para leer y escribir).
estructuraEl C es simple (no grave de anidación o puntero referencias) y tiene el siguiente aspecto:
struct MyStructure {
char *title;
int id;
int param1;
int param2;
float *data;
}
La parte que son susceptibles de cambiar la mayoría son los enteros param.
¿Cuáles son mis opciones aquí?
Un gran problema con DataInput/DataOutput es que leen/escriben datos de múltiples bytes en formato Big Endian. Esto también se aplica a java.io.RandomAccessFile. Afortunadamente puede usar java.io.ByteBuffer para leer/escribir en formato Little Endian. Incluso puede usar .order (ByteOrder.LITTLE_ENDIAN) y .order (ByteOrder.BIG_ENDIAN) para intercambiar entre formatos a lo largo de una secuencia. – AlwaysLearning