2009-07-10 7 views
4

Ich habe eine einfache Frage zu std :: string und googles Protokollpufferbibliothek. ich eine Nachricht wie so definiert habe:Protokollpuffer zum Senden von Symbolen/kleinen Bildern verwenden

message Source 
{ 
    required string Name = 1; 
    required uint32 Id = 2; 
    optional string ImplementationDLL = 3; 
    optional bytes Icon = 4; 
} 

Ich mag das Feld Symbol verwenden, um ein Bild zu senden, ist es sehr wahrscheinlich ein PNG-Bild sein. Nachdem ich dies dem Protobuf-Compiler zugeführt hatte, bekam ich so etwas, um auf das Icon-Feld zuzugreifen/es zu manipulieren.

Die Funktion std :: string * mutable_icon() gibt mir Kopfschmerzen. Es gibt eine std :: string zurück, aber ich glaube, Zeichenfolgen können keine binären Daten enthalten! oder können sie?

ich kann set_icon (const void *, size_t) -Funktion verwenden, um binäre Daten zu setzen, aber dann, wie bekomme ich es auf der anderen Seite?

ich denke, std :: string könnte binäre Daten halten, aber wie ????

Antwort

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

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

C++ strings stellen die Länge explizit, so they can contain binary data, einschließlich der 0-Zeichen, das C-Strings endet.

Sie müssen vermeiden, die Zeichenfolge an Funktionen zu übergeben, die eine C-artige Zeichenfolge erwarten, da sie keine eingebetteten 0-Zeichen verarbeiten.

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

Das ziemlich ineffizient ist es zu einem Zeitpunkt ein Byte zu schreiben. Besser, einfach ['binFile.data()'] (http://www.cplusplus.com/reference/string/string/data/) auf einmal zu schreiben. – poolie

Verwandte Themen