Utilizzando il protocollo buffer per inviare icone / piccole immagini
-
12-09-2019 - |
Domanda
Ho una semplice domanda su std :: string e la biblioteca buffer di protocollo di Google. Ho definito un messaggio in questo modo:
message Source
{
required string Name = 1;
required uint32 Id = 2;
optional string ImplementationDLL = 3;
optional bytes Icon = 4;
}
Vorrei utilizzare il campo Icona di inviare un'immagine, molto probabilmente sarà un'immagine png. Dopo l'alimentazione presente al compilatore protobuf ho ottenuto qualcosa di simile per l'accesso / manipolare il campo Icona.
inline bool has_icon() const;
inline void clear_icon();
static const int kIconFieldNumber = 4;
inline const ::std::string& icon() const;
inline void set_icon(const ::std::string& value);
inline void set_icon(const char* value);
inline void set_icon(const void* value, size_t size);
inline ::std::string* mutable_icon();
la std :: string * Funzione mutable_icon () mi sta dando un mal di testa. Si sta tornando uno std :: string, ma credo che le stringhe non possono contenere dati binari! o possono?
posso usare la funzione set_icon (const void *, size_t) a mettere i dati binari, ma allora come faccio a farlo dall'altra parte?
Credo che std :: string potrebbe essere in grado di tenere i dati binari, ma come ????
Soluzione 3
La risposta a questa domanda: Come si fa costruire una std :: string con un nulla incorporato?
Altri suggerimenti
const std::string s = icon();
const void *data=s.c_str();
C ++ stringhe rappresentano la lunghezza in modo esplicito, in modo da che possono contenere dati binari , tra cui il 0 caratteri che termina le stringhe C .
È necessario evitare di passare la stringa alle funzioni che prevedono una stringa in stile C, dal momento che non gestirà incorporato 0-caratteri.
void String2Image(string binFile,const char* outImage)
{
fstream imgFile(outImage,ios::binary|ios::out);
for(int i=0; i<binFile.length(); ++i)
{
imgFile << binFile[i];
}
imgFile.close();
}