Использование буферов протокола для отправки значков / небольших изображений - PullRequest
4 голосов
/ 10 июля 2009

У меня простой вопрос о 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 ]

5 голосов
/ 10 июля 2009
const std::string s = icon();

const void *data=s.c_str();
4 голосов
/ 10 июля 2009

Строки C ++ явно представляют длину, поэтому могут содержать двоичные данные , включая символ 0, который завершает строки C.

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

2 голосов
/ 10 июля 2009
1 голос
/ 18 марта 2011
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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...