Ho un progetto C++ incorporato in cui sto leggendo una serie di int32 da un dispositivo hardware, quindi li impacchetta in un array int come parte di una grande struttura di dati, quindi invio a un remoto sistema su TCP/IP. Quindi, stavo usando una semplice struttura di dati con un mucchio di cose definite e ora voglio convertirle per usare i Protocol Buffers. Quindi, stavo pensando di usare un "ripetuto int32 data" come elemento del mio proto buff. Ma voglio evitare l'uso di un ciclo come questo:Buffer del protocollo C++, invio di array intero
int hardware_data[1000]; // An array that holds the data read from the hardware
for(int i=0; i< sizeof(hardware_data); i++)
{
proto.add_data(hardware_data[i]);
}
Preferirei mille volte usare un metodo efficace, come la realizzazione di buff proto solo punto alle hardware_data esistenti [] array (un metodo di copia zero) , o usando memcpy da hardware_data in proto.data.
Capisco come impostare memcpy(), ma come fa il proto buff sapere quanti elementi ci sono nell'array proto.data? Posso ancora utilizzare il proto.data_size() per ottenere il numero di elementi? Esiste un modo efficace per spostare i dati dal mio hardware letto al proto buff per l'invio? C'è un modo migliore per farlo?
Kerrik, Non ero a conoscenza dell'API zero copy. Ecco la mia definizione proto:
message hardware_data
{
optional Lob lob = 1;
optional int32 taskSeqNum = 2;
optional int32 secondsOfDay = 3;
optional float IQOutRateKhz = 4;
optional float IQBwKhz = 5;
optional int32 tStart = 6;
optional int32 tOffset = 7;
optional float collectionTime = 8;
optional int32 numSamples = 9;
optional int32 chunk = 10;
optional int32 dimSize = 11;
repeated int32 data = 12 [packed=true];
}
io non sono sicuro di come la copia di zero avrebbe giocato in questa definizione proto buff.
Quale parte dell'API [zero copy] (https://developers.google.com/protocol-buffers/docs/reference/cpp/google.protobuf.io.zero_copy_stream) non è adatta a te? –
L'operatore 'sizeof' restituisce la dimensione della struttura dati in * byte *, quindi per array di 1000 elementi di' int's è probabilmente 4000 e il ciclo indicherà l'array molto oltre la sua fine effettiva, causando così un comportamento indefinito. Usa 'sizeof (hadware_data)/sizeof (hardware_data [0])' per calcolare il * numero di elementi * dell'array. – CiaPan
Certo .... l'ho inserito solo come codice di esempio. Il tuo commento, se corretto, non fa nulla per rispondere alla domanda su come utilizzare il buffer del protocollo. – rbwilliams