如何在没有尾随字节\x00 的情况下发送不同长度的消息?

How to send a message of different lengths without trailing bytes \x00?

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

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

通过阅读文档,message(20) 将消息初始化为 20 字节长。 message.data(), 之后的 20 是做什么的?

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

您可以使用限制为零的 snprintf() 来衡量数据的大小,然后再为其分配 space:

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);

您也可以格式化到您知道足够大的本地缓冲区,测量字符串的长度,然后复制它:

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);