2017-04-27 125 views
0

20裏面的message()是什麼意思與20之間的message.data(),在下面的代碼中?如何發送不包含字節 x00的不同長度的消息?

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,並使用該變量的長度來啓動消息併發送消息?

+0

*「20後message.data()做了什麼?」*您是否閱讀過'snprintf()'函數的文檔? – cdhowie

+0

謝謝,我讀過它然後http://www.cplusplus.com/reference/cstdio/snprintf/。這意味着如果用戶打算髮送整個消息,則大小例如'message()'和'snprintf()'中的'20'必須相同,是否正確? – Greg

+1

'snprintf()'的參數僅用於防止'snprintf()'溢出它正在寫入的分配。也就是說,如果要寫超過20個字符,告訴它可能只寫20個字符會導致它提前停止。 (考慮「溫度」和「溼度」每個都有7位以上的情況 - 消息的大小不足以容納格式化文本,超出緩衝區末尾的寫入會導致未定義的行爲。) – cdhowie

回答

1

可以使用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); 

你也可以格式化成,你知道是足夠大的本地緩存,測量字符串的長度,然後複製它:

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

有沒有如何將「%05d%d%d」,zipcode,temperature,relhumidity'分配給變量,然後計算長度?這會更有效率嗎?也就是說,「%05d%d%d」,郵編,溫度,溼度是否會被評估兩次?評估它兩次的成本是否高於將其分配給一個變量並獲取該變量? – Greg

+0

@Dave您使用的方法取決於格式化消息可能有多少差異。例如,如果您包含可變長度的字符串。基本上,你只能使用一個靜態大小的本地緩衝區,如果你知道字符串將適合它。 – cdhowie

+0

一次格式化爲單個字符串時,大約有15個可變長度字符串,總計從150到200個字節。 – Greg

相關問題