El uso de Protocol Buffers para enviar pequeños iconos / imágenes
-
12-09-2019 - |
Pregunta
Tengo una pregunta simple sobre std :: string y la biblioteca de búferes de protocolo de Google. He definido un mensaje de este modo:
message Source
{
required string Name = 1;
required uint32 Id = 2;
optional string ImplementationDLL = 3;
optional bytes Icon = 4;
}
Quiero usar el campo Icono para enviar una imagen, es muy probable que sea una imagen GIF. Después de alimentar esta al compilador protobuf tengo algo como esto para acceder a / manipular el campo Icono.
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();
el std :: string * Función mutable_icon () me está dando un dolor de cabeza. Se está volviendo un std :: string, pero creo que las cadenas no pueden contener datos binarios! o pueden?
i puede utilizar la función set_icon (const void *, size_t) para poner los datos binarios, pero entonces, ¿cómo lo consigo en el otro lado?
Creo que std :: string podría ser capaz de mantener los datos binarios, pero ¿????
Solución 3
la respuesta a esta pregunta: ¿Cómo construir un std :: string con un nulo incrustado?
Otros consejos
const std::string s = icon();
const void *data=s.c_str();
cadenas de C ++ representan la longitud de forma explícita, por lo que pueden contener datos binarios , incluyendo el 0-carácter que termina cadenas de C .
Es necesario evitar pasando la cadena de funciones que esperan una cadena de estilo C, ya que no manejará incrustado 0-chars.
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();
}