Sto scrivendo un programma per creare, inviare, ricevere e interpretare i pacchetti ARP. Ho una struttura che rappresenta l'intestazione ARP simili:Array di lunghezza variabile C++ nella struttura
struct ArpHeader
{
unsigned short hardwareType;
unsigned short protocolType;
unsigned char hardwareAddressLength;
unsigned char protocolAddressLength;
unsigned short operationCode;
unsigned char senderHardwareAddress[6];
unsigned char senderProtocolAddress[4];
unsigned char targetHardwareAddress[6];
unsigned char targetProtocolAddress[4];
};
Questo funziona solo per gli indirizzi hardware con lunghezza 6 e protocollo indirizzi con lunghezza 4. L'indirizzo lunghezze sono indicate nel intestazione, così sia corretta la la struttura dovrebbe essere simile a questa:
struct ArpHeader
{
unsigned short hardwareType;
unsigned short protocolType;
unsigned char hardwareAddressLength;
unsigned char protocolAddressLength;
unsigned short operationCode;
unsigned char senderHardwareAddress[hardwareAddressLength];
unsigned char senderProtocolAddress[protocolAddressLength];
unsigned char targetHardwareAddress[hardwareAddressLength];
unsigned char targetProtocolAddress[protocolAddressLength];
};
questo ovviamente non funzionerà in quanto le lunghezze di indirizzo non sono noti al momento della compilazione. Le strutture di template non sono un'opzione neanche perché vorrei inserire i valori per la struttura e poi lanciarli da (ArpHeader *) a (char *) per ottenere un array di byte che può essere inviato sulla rete o sul cast una matrice di byte ricevuta da (char *) a (ArpHeader *) per interpretarla.
Una soluzione sarebbe quella di creare una classe con tutti i campi di intestazione come variabili utente, una funzione per creare una matrice di byte che rappresenta l'intestazione ARP che può essere inviato sulla rete e un costruttore che vorrebbe solo un array di byte (ricevuto sulla rete) e interpretarlo leggendo tutti i campi di intestazione e scrivendoli alle variabili membro. Questa non è una buona soluzione, dal momento che richiederebbe molto più codice.
Al contrario una struttura simile per un'intestazione UDP, ad esempio, è semplice poiché tutti i campi di intestazione sono di dimensione costante nota. Io uso
#pragma pack(push, 1)
#pragma pack(pop)
attorno alla dichiarazione della struttura in modo che io possa effettivamente fare una semplice fusione C-stile per ottenere un array di byte da inviare sulla rete.
C'è qualche soluzione che potrei usare qui che sarebbe vicino a una struttura o almeno non richiedere molto più codice di una struttura? So che l'ultimo campo di una struttura (se si tratta di un array) non ha bisogno di una specifica dimensione di compilazione, posso usare qualcosa di simile come quello per il mio problema? Basta lasciare le dimensioni di quei 4 array vuoti per compilare, ma non ho idea di come funzionerebbe. Solo logicamente parlando non può funzionare poiché il compilatore non avrebbe idea di dove inizia il secondo array se la dimensione del primo array è sconosciuta.
Se la dimensione massima dell'indirizzo è 6, non è possibile creare gli array di dimensioni [6] e quindi interpretarli di conseguenza? Questa è la soluzione più semplice se vuoi evitare un sacco di codice.Un'altra opzione sarebbe quella di utilizzare un grande array di lunghezza fissa per tutti gli indirizzi e scrivere una funzione che prepari un array di byte basato sulle lunghezze degli indirizzi –
Gli array di lunghezza zero oi membri di array flessibili non sono C++ validi. – pmr
perché non usare std :: string o std :: vector come membro di una struttura? E se usi una struttura, perché non gli dai la funzionalità? Dividere il codice in dati e programmi è esattamente l'opposto della programmazione orientata agli oggetti. La tua domanda suona come un fallimento del design! – Klaus