2009-07-10 3 views
4

У меня есть простой вопрос о библиотеке буферов протоколов std :: string и google. Я определил сообщение следующим образом:Использование буферов протокола для отправки значков/небольших изображений

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

Я хочу использовать поле Icon, чтобы отправить изображение, то, скорее всего, будет изображение PNG. После подачи этого файла на компилятор protobuf я получил что-то вроде этого, чтобы получить доступ к полю 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(); 

Функция std :: string * mutable_icon() дает мне головную боль. Он возвращает std :: string, но я считаю, что строки не могут содержать двоичные данные! или они могут?

Я могу использовать функцию set_icon (const void *, size_t), чтобы поместить двоичные данные, но тогда как я могу получить ее с другой стороны?

Я думаю, std :: string может содержать двоичные данные, но как ????

ответ

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

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

C++ строка представляет длину в явном виде, так they can contain binary data, в том числе 0-символа, который заканчивается строками C.

Вам нужно избегать передачи строки в функции, ожидающие строки стиля C, поскольку они не будут обрабатывать встроенные 0-символы.

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

Это довольно неэффективно, чтобы написать это один байт за один раз. Лучше просто написать ['binFile.data()'] (http://www.cplusplus.com/reference/string/string/data/) за один раз. – poolie

 Смежные вопросы

  • Нет связанных вопросов^_^