【问题标题】:Get zeromq message data into std::vector<char>获取 zeromq 消息数据到 std::vector<char>
【发布时间】:2014-11-09 07:12:27
【问题描述】:

给定这样收到的 zeromq 消息:

zmq_msg_t messageIn;
int rc = zmq_msg_init(&messageIn);
rc = zmq_msg_recv(&messageIn, socket, 0);

我想访问传入的消息数据并将其存储到一个;

std::vector<char> inMsg;

试试这个;

std::memcpy(&inMsg, zmq_msg_data(&messageIn), zmq_msg_size(&messageIn));

没有用。任何人都可以就如何实现这一目标提出建议吗?

【问题讨论】:

  • memcpy 使用 inMsg 地址显然没有做你想要的,因为它不指向存储。拉维回答了你的问题。使用他得到的 msg_str,您可以使用 msg_str.begin()end() 迭代字符。如果您不想使用std::string,您可以使用数组。 char *inMsg = new char[zmq_msg_size(&amp;messageIn); 然后 memcpy 像你一样进入这个数组。

标签: c++ blob zeromq


【解决方案1】:

它不起作用的原因是因为您似乎没有将vector 的大小调整为您尝试复制到其中的数据的容量。它也不起作用,因为您将vector 对象的地址传递给memcpy,而不是vector 正在存储的数据的地址。 vector 对象通常只包含两个指向它管理的存储的开头和结尾的指针。您要访问的是指向该存储的指针,您可以使用 &amp;inMsg[0] 或 C++11 中的 inMsg.data() 获得。

那就试试吧:

std::vector<char> inMsg(zmq_msg_size(&messageIn));
std::memcpy(inMsg.data(), zmq_msg_data(&messageIn), zmq_msg_size(&messageIn));

【讨论】:

  • memcpy 通常不好。考虑char* ptr = static_cast&lt;char*&gt;(zmq_msg_data(&amp;messageIn)); inMsg.assign(ptr, ptr + zmq_msg_size(&amp;messageIn));
【解决方案2】:

您可以执行以下操作。

zmq::message_t request;

socket.recv (&request);

std::string msg_str(static_cast<char*>(request.data()), request.size());

然后将字符串存储在向量中。处理起来会容易得多...

std::vector<std::string> strVec;
strVec.push_back(msg_str);

【讨论】:

  • 是的,接收消息可以用 std::string 完成,但这不是我要的。
猜你喜欢
  • 2011-10-26
  • 2012-03-07
  • 2014-12-11
  • 1970-01-01
  • 1970-01-01
  • 2021-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多