2013-05-07 14 views
5

Sto imparando la struttura dell'imbottitura e dell'imballaggio in C. Ho questo dubbio, poiché ho letto che il riempimento dipenderà dall'architettura, quindi influisce sulla comunicazione tra macchine ?, es. se i dati creati su una macchina vengono letti su un'altra macchina. Come evitare questo problema in questo scenario.Imbottitura struttura

risposta

2

#pragma pack è supportato dalla maggior parte dei compilatori che conosco. Ciò può consentire al programmatore di specificare il metodo di riempimento desiderato per le strutture.

http://msdn.microsoft.com/en-us/library/2e70t5y1%28v=vs.80%29.aspx

http://gcc.gnu.org/onlinedocs/gcc/Structure_002dPacking-Pragmas.html

http://clang.llvm.org/docs/UsersManual.html#microsoft-extensions

+0

Questo è vero, ma grossolanamente fuorviante nel contesto della comunicazione attraverso una rete o la condivisione di file tra piattaforme. –

+0

Sì, è possibile modificare il riempimento della struttura. ** Questo può essere pericoloso.** Alcune API richiedono che i dati siano allineati correttamente. Cambiare il padding può rovinarlo. – Anthony

+0

E la modifica del riempimento della struttura non è sufficiente per garantire che i dati vengano interpretati allo stesso modo su macchine diverse. Ci sono molti altri aspetti, come il modo in cui vengono rappresentati i float/double, il modo in cui vengono rappresentati gli interi con segno, qual è l'ordine dei byte degli interi, la dimensione di un tipo di dati ('char',' int', 'long',' long long'?), e ammucchia di più. – Anthony

6

Sì, non è possibile inviare i dati binari di una struttura tra le piattaforme e si aspettano di guardare lo stesso sull'altro lato.

Il modo in cui lo risolvi è creare un marshaller/demarshaller per il tuo costrutto e passarlo attraverso l'uscita da un sistema, e nel percorso verso l'altro sistema. Ciò consente al compilatore di occuparsi del buffering per te su ciascun sistema.

Ogni parte sa come prendere i dati, come è stato specificato verrà inviato e gestirli per la piattaforma locale.

Piattaforme come java gestiscono questo per te creando meccanismi di serializzazione per le tue classi. In C, dovrai farlo tu stesso. Come lo fai dipende da come vuoi inviare i tuoi dati. Potresti serializzare su binario, XML o qualsiasi altra cosa.

+0

[xdr] (http://linux.die.net/man/3/xdr) vale la pena guardare. – Anthony

+0

Uno di questi marshaller/demarshaller è la libreria msgpack: http://msgpack.org/ – Matt

0

Sarà interessato solo se il codice che è stato compilato per un'altra architettura utilizza uno schema di riempimento diverso.

Per aiutare ad alleviare i problemi, vi consiglio di impacchettare le strutture senza imbottitura. Se è necessaria una protezione, utilizzare i segnaposti (ad es. char reserved[2]). Inoltre, non usare bitfield !! Non sono portatili.

Si dovrebbe anche essere a conoscenza di altri problemi relativi all'architettura. Specificità endianness e dimensioni dei tipi di dati. Se hai bisogno di una portabilità migliore, potresti voler serializzare e de-serializzare un flusso di byte invece di lanciarlo come struct.

0

È possibile utilizzare #pragma pack (1) prima della struct declaration e #pragma pack() prima di disabilitare l'imballaggio basato sull'architettura; questo risolverà metà del problema perché alcuni tipi di dati sono basati sull'architettura, per risolvere la seconda parte di solito utilizzo un tipo di dati specifico come int_16 per interi a 16 bit, u_int_32 per numeri interi a 32 bit e così via.

Dai uno sguardo allo http://freebsd.active-venture.com/FreeBSD-srctree/newsrc/netinet/ip_icmp.h.html; questo include descrivere alcuni pacchetti di dati di rete indipendenti dall'architettura.

1

In C/C++ vengono utilizzate strutture come pacchetto dati. Non fornisce alcuna incapsulazione di dati o funzionalità di occultamento dei dati (il caso C++ è un'eccezione dovuta alla sua somiglianza semantica con le classi).

A causa dei requisiti di allineamento di vari tipi di dati, ogni membro della struttura deve essere allineato in modo naturale. I membri della struttura hanno assegnato un ordine in sequenza crescente.