Utiliser des buffers Protocole pour envoyer des icônes / petites images
-
12-09-2019 - |
Question
J'ai une simple question à propos de std :: string et la bibliothèque de tampons de protocole de Google. J'ai défini un message comme ceci:
message Source
{
required string Name = 1;
required uint32 Id = 2;
optional string ImplementationDLL = 3;
optional bytes Icon = 4;
}
Je veux utiliser le champ Icône d'envoyer une image, il sera très probablement une image .png. Après avoir nourri ce au compilateur protobuf j'ai eu quelque chose comme ça pour l'accès / manipuler le champ Icône.
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 * fonction mutable_icon () me donne un mal de tête. Il retourne un std :: string mais je crois que les chaînes ne peuvent contenir des données binaires! ou peuvent-ils?
je peux utiliser la fonction set_icon (const void *, size_t) pour mettre les données binaires, mais comment puis-je obtenir de l'autre côté?
Je pense que std :: string peut être en mesure de contenir des données binaires, mais comment ????
La solution 3
la réponse à cette question: Comment trouvez-vous construire un std :: string avec un null embedded?
Autres conseils
const std::string s = icon();
const void *data=s.c_str();
Les chaînes C représentent la longueur de façon explicite, de sorte ils peuvent contenir des données binaires , y compris le 0 caractères qui met fin à chaînes C .
Vous devez éviter de passer la chaîne à une chaîne fonctions C attente de style, car ils ne traitera pas intégré 0-caractères.
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();
}