2009-07-10 3 views
4

J'ai une question simple à propos de std :: string et de la bibliothèque de tampons de protocole de google. J'ai défini un message comme ceci:Utilisation de tampons de protocole pour envoyer des icônes/petites images

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 l'avoir introduit dans le compilateur protobuf, j'ai obtenu quelque chose comme ceci pour accéder/manipuler le champ Icon.

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 fonction std :: string * mutable_icon() me donne un mal de tête. Il retourne une chaîne std :: mais je crois que les chaînes ne peuvent pas contenir de données binaires! ou peuvent-ils?

Je peux utiliser la fonction set_icon (const void *, size_t) pour mettre des données binaires, mais comment puis-je l'obtenir de l'autre côté?

Je pense que std :: string pourrait contenir des données binaires, mais comment?

Répondre

4
const std::string s = icon(); 

const void *data=s.c_str(); 
3

chaînes de C++ explicite représentent la longueur, de sorte they can contain binary data, y compris le 0 caractères qui met fin à chaînes C.

Vous devez éviter de passer la chaîne aux fonctions qui attendent une chaîne de style C, car elles ne gèreront pas les 0-caractères incorporés.

1
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(); 
} 
+0

qui est assez inefficace pour l'écrire sur un octet à la fois. Mieux vaut simplement écrire ['binFile.data()'] (http://www.cplusplus.com/reference/string/string/data/) en une seule fois. – poolie

Questions connexes