我正在使用mosquitto向订阅者发布一些消息。
对于我使用的订阅者:
mosquitto_sub -h host -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版本中修复。
答案 0 :(得分:3)
解码字符串的第二个字符的值为零。那用来标记C风格字符串的结尾;所以strlen
会在一个字符后找到零时报告长度为1。
如果要使用包含空字符的“字符串”,则不能使用C库的以空值终止的字符串处理函数。我将MyClass::publish
更改为使用C ++字符串(或者std::vector<uint8_t>
,以便它不会被误认为是可打印的字符串),因此长度可用message.size()
无论是不包含空字符。