Attualmente, sto salvando e caricando alcuni dati in strutture C/C++ in file usando fread()/fwrite(). Funziona bene quando si lavora all'interno di questa app C (posso ricompilare ogni volta che la struttura cambia per aggiornare gli argomenti sizeof() su fread()/fwrite()), ma come posso caricare questo file in altri programmi senza sapere in anticipo la sizeof() s della struttura C?Il modo migliore per serializzare una struttura C da deserializzare da Java, ecc.
In particolare, ho scritto questa altra app Java che visualizza i dati contenuti in quel file binario struct C, ma mi piacerebbe una soluzione generale su come leggere quel file binario. (Invece di dover inserire manualmente il sizeof() s nella sorgente dell'app Java ogni volta che la struttura C cambia ...)
Sto pensando di serializzare in un testo o XML di qualche tipo, ma io sono non so da che parte cominciare (come serializzare in C, poi come deserializzare in Java ed eventualmente in altri linguaggi in futuro), e se è consigliabile qui dove un membro della struct è un array float che può andare verso l'alto di ~ 50 MB in formato binario (e ho centinaia di questi file di dati da leggere e scrivere).
strutturaLa C è semplice (non grave nidificazione o puntatore riferimenti) e si presenta come la seguente:
struct MyStructure {
char *title;
int id;
int param1;
int param2;
float *data;
}
La parte che possono cambiare di più sono gli interi param.
Quali sono le mie opzioni qui?
Un grande trucco con DataInput/DataOutput è che leggono/scrivono dati multi-byte in formato Big Endian. Questo vale anche per java.io.RandomAccessFile. Fortunatamente puoi usare java.io.ByteBuffer per leggere/scrivere in formato Little Endian. Puoi anche utilizzare .order (ByteOrder.LITTLE_ENDIAN) e .order (ByteOrder.BIG_ENDIAN) per passare da un formato all'altro di un flusso. – AlwaysLearning