目录
如何在不拖尾字节的情况下发送不同长度的消息 \x00?
c++zeromq
浏览量:61
编辑于:2023-04-12 22:59:46

在下面的代码中,内部与之后是什么意思?20``message()``20``message.data(),

zmq::message_t message(20);
snprintf ((char *) message.data(), 20 ,"%05d %d %d", zipcode, temperature, relhumidity);
publisher.send(message);

从阅读文档开始,将消息初始化为 20 字节长。后做什么?message(20)``20``message.data(),

如何更改消息的大小以发送不带尾随字节的消息?是否可以在外部声明,并且该变量的长度用于启动消息并发送它?\x00``"%05d %d %d", zipcode, temperature, relhumidity

解决方案:

在为数据分配空间之前,您可以使用限制为零来测量数据的大小:snprintf()

auto length = std::snprintf(nullptr, 0, "%05d %d %d", zipcode, temperature, relhumidity) + 1;
// +1 to account for null terminating character.

zmq::message_t message(length);

std::snprintf(
    static_cast<char *>(message.data()), length,
    "%05d %d %d", zipcode, temperature, relhumidity
);

publisher.send(message);

You could also format into a local buffer that you know is large enough, measure the string's length, then copy it:

char buffer[64];

auto length = std::snprintf(buffer, 64, "%05d %d %d", zipcode, temperature, relhumidity) + 1;

zmq::message_t message(length);

std::copy(buffer, buffer + length, static_cast<char *>(message.data());

publisher.send(message);