Преобразование std :: string в c-string mosquitto

Я использую комаров, чтобы опубликовать какое-то сообщение для подписчика.

Для подписчика я использую:

mosquitto_sub -h хост -t «new_topic» -q 0

Вместо этого для публикации я разрабатываю программу, которая использует оболочку mosquittopp, но не имеет отношения к делу.

Я отправляю сообщение, используя этот метод:

int MyClass::publish(const char* message) {
return mosquittopp::publish(NULL, topic_, strlen(message),
(uint8_t*) message, qos_);
}
....
MyClass publisher;
string s = base64_decode("LAAAtQ8AIXRpwoVyeMKodMK2wpPDscKBYcKDw6jCg8KAYWDDhjVCMQ==");
publisher.publish(s.c_str());

Если я печатаю s, я получаю:

,�!tirx¨t¶ñaèa`Æ5B1

И я думаю, что все в порядке.

Но подписчик, кажется, получает только первый символ, фактически печатает только:

 ,

Есть идеи?

Это был BUG на версии, которую я использовал (1.3.1), исправлено с версии 1.3.4.

1

Решение

Второй символ декодированной строки имеет значение ноль. Используется для обозначения конца строки в стиле C; так strlen сообщит длину 1 при обнаружении нуля после одного символа.

Если вы хотите использовать «строки», содержащие нулевые символы, вы не можете использовать функции обработки строк с нулевым символом в конце библиотеки C. Я бы поменял MyClass::publish работать со строкой C ++ (или, возможно, std::vector<uint8_t> так что это не будет принято за строку для печати), поэтому длина доступна как message.size() содержит ли он нулевые символы.

3

Другие решения


По вопросам рекламы [email protected]