Usando o protocolo buffers para enviar ícones / imagens pequenas
-
12-09-2019 - |
Pergunta
Eu tenho uma pergunta simples sobre std :: string e biblioteca de buffers de protocolo do Google. Defini uma mensagem assim:
message Source
{
required string Name = 1;
required uint32 Id = 2;
optional string ImplementationDLL = 3;
optional bytes Icon = 4;
}
Eu quero usar o campo Ícone para enviar uma imagem, ela provavelmente será uma imagem png. Depois de alimentar este para o compilador protobuf eu tenho algo parecido com isto para acessar / manipular o campo Ícone.
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();
a função std :: string * mutable_icon () está me dando uma dor de cabeça. Ele está retornando um std :: string, mas eu acredito cordas não pode conter dados binários! ou podem?
i pode usar set_icon (const void *, size_t) para colocar os dados binários, mas então como faço para obtê-lo do outro lado?
eu acho que std :: string pode ser capaz de armazenar dados binários, mas como ????
Solução 3
A resposta a esta pergunta: Como você construir um std :: string com um nulo incorporado?
Outras dicas
const std::string s = icon();
const void *data=s.c_str();
strings C ++ representam o comprimento explicitamente, então eles podem conter dados binários , incluindo o 0 caracteres que termina strings C .
Você precisa evitar passar a string para funções que esperam uma seqüência de estilo C, uma vez que não vai lidar com incorporado 0-caracteres.
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();
}