Sto progettando un formato di file binario per memorizzare stringhe [senza terminare null per risparmiare spazio] e dati binari.Come gestire i problemi di portabilità in un formato di file binario
i. Qual è il modo migliore per gestire sistemi little/big endian? i.a Converte tutto in ordine di byte di rete e viceversa con ntohl()/htonl() funziona?
ii. Le strutture impacchettate avranno le stesse dimensioni su x86, x64 e arm?
iii. Sono la loro debolezza intrinseca con questo approccio?
struct __attribute__((packed)) Header {
uint8_t magic;
uint8_t flags;
};
struct __attribute__((packed)) Record {
uint64_t length;
uint32_t crc;
uint16_t year;
uint8_t day;
uint8_t month;
uint8_t hour;
uint8_t minute;
uint8_t second;
uint8_t type;
};
codice Tester Sto utilizzando il sviluppano il formato:
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <limits.h>
#include <strings.h>
#include <stdint.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
struct __attribute__((packed)) Header {
uint8_t magic;
uint8_t flags;
};
struct __attribute__((packed)) Record {
uint64_t length;
uint32_t crc;
uint16_t year;
uint8_t day;
uint8_t month;
uint8_t hour;
uint8_t minute;
uint8_t second;
uint8_t type;
};
int main(void)
{
int fd = open("test.dat", O_RDWR|O_APPEND|O_CREAT, 444);
struct Header header = {1, 0};
write(fd, &header, sizeof(header));
char msg[] = {"BINARY"};
struct Record record = {strlen(msg), 0, 0, 0, 0, 0, 0, 0};
write(fd, &record, sizeof(record));
write(fd, msg, record.length);
close(fd);
fd = open("test.dat", O_RDWR|O_APPEND|O_CREAT, 444);
read(fd, &header, sizeof(struct Header));
read(fd, &record, sizeof(struct Record));
int len = record.length;
char c;
while (len != 0) {
read(fd, &c, 1);
len--;
printf("%c", c);
}
close(fd);
}
Sto votando per chiudere, come troppo generico per SO - scusa, prova un altro sito! – Olaf
@Olaf: vorrei votare per mantenere: questo è un tipo di domanda molto pratico nel mondo reale che viene fuori tutto il tempo. Solo perché non ha una singola risposta tagliata e secca non significa che non meriti considerazione. (Con quello detto, però, non sono un SO regolare, quindi se il consenso è che ci sono alcune porzioni di domande di programmazione pratiche e reali che questo sito non è per, non sono in grado di discutere.) –
@SteveSummit: Sono d'accordo sul fatto che la domanda è in realtà interessante (attenzione al mio "scusa"). Tuttavia, è fuori tema per SO. Spero davvero che l'OP trovi un altro sito (non è sicuro, se ce n'è uno nello scambio di stack). Per il voto: bene, questo è chiaramente il mio parere. Se gli altri pensano diversamente, resterà aperto. Posso vivere con quello. – Olaf