Использование буферов протокола для отправки значков / небольших изображений
-
12-09-2019 - |
Вопрос
У меня есть простой вопрос о std::string и библиотеке буферов протокола Google.Я определил сообщение следующим образом:
message Source
{
required string Name = 1;
required uint32 Id = 2;
optional string ImplementationDLL = 3;
optional bytes Icon = 4;
}
Я хочу использовать поле Icon для отправки изображения, скорее всего, это будет изображение в формате png.После отправки этого в компилятор protobuf я получил что-то вроде этого для доступа к полю значка / манипулирования им.
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 мог бы содержать двоичные данные, но как ????
Решение 3
ответ на этот вопрос: Как вы создаете std::string со встроенным null?
Другие советы
const std::string s = icon();
const void *data=s.c_str();
Строки C ++ представляют длину явно, так что они могут содержать двоичные данные, включая символ 0, который завершает строки C.
Вам нужно избегать передачи строки функциям, ожидающим строку в стиле C, поскольку они не будут обрабатывать встроенные 0-символы.
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();
}