如何通过 zeromq 发送包含 \0 的序列化跳跃运动帧?
How to send a serialized leap motion frame containing 's via zeromq?
我需要使用Zeromq通过网络发送LEAP运动框架。发送和接收功能似乎已经有效,但是我对发送的数据有疑问。
LEAP ::帧类包含一个序列化和Deserialze方法,该方法创建给定帧的字节字符串(或从字符串中重新创建帧)。
对于这个简单的示例,我在任何类或从客户端到服务器的其他类别中发送了字符串。
问题是字节字符串似乎在其中有一些 0,因此只有数据到第一个 0到达服务器。
客户端:
int main(int argc, char** argv)
{
Leap::Controller controller;
zmq::context_t context = zmq::context_t(1);
zmq::socket_t client = zmq::socket_t(context, ZMQ_REQ);
client.connect("tcp://192.168.0.101:6881");
while(true)
{
Leap::Frame frame = controller.frame(0);
std::string frame_string = frame.serialize();
zmq::message_t message( frame_string.size() );
memcpy(message.data(), &frame_string, frame_string.size());
client.send(message);
}
return 0;
}
服务器:
int main(int argc, char** argv)
{
zmq::context_t context = zmq::context_t(1);
zmq::socket_t server = zmq::socket_t(context, ZMQ_REP);
server.bind("tcp://*:6881");
while(true)
{
zmq::message_t message;
server.recv(&message);
std::string frame_string(static_cast<char*>(message.data()), message.size());
Leap::Frame received_frame;
received_frame.deserialize(frame_string);
}
return 0;
}
这些是客户端串行框架的前200个字符(一只手的框架的总尺寸约为3700个字符)。许多 0中的第一个位于位置149(以粗体突出显示):
s x1è x1d bòï了 x2 x110ýë裧 x1 x1až x3 x3 b2 b2 '3 n n xf xf re军x1dæx•á x12 xf r² b r¾ x15w/õ= x1d†| x6b* xf rôx x1a?x15èx5g¿ x1d |k7¾2! x15 x1fá x18c x18〜 x19 t‡ 0 p0_@àbw n x1b t8o x13u x13u x15( x12 x1b t x12 x1> b&lt;±? x117t x2
在服务器端以下到达:
s x1è x1d bòï了 x2 x110ýë裧 x1 x1až x3 x3 b2 b2 '3 n n xf xf re军x1dæx•á x12 xf r² b r¾ x15w/õ= x1d†| x6b* xf rôx x1a?x15èx5g¿ x1d |k7¾2! x15 x1fá x18c x18〜 x19 t‡
毫不奇怪,直到第一个 0到达服务器,毫不奇怪。有人知道解决方案以发送 0的字节阵列或另一种解决此问题的方法吗?
该解决方案应尽可能快,因为LEAP传感器每秒创建约100帧或更多帧(最多200帧),我需要尽可能多地获得它们。
预先感谢。
尝试初始化带有大小的消息。目前,您的memcpy已进入msg.data(),但未分配。
zmq::message_t message( frame_string.size() );
memcpy(message.data(), frame_string.c_str(), frame_string.size());
client.send(message);
另外,当收到消息时,您不需要用大小初始化它,RECV调用将为您调整大小。
zmq::message_t message;
server.recv(&message);
- 如何在C++中序列化结构数据
- 序列化,没有库的整数,得到奇怪的结果
- 如何知道QDataStream不能反序列化某些内容
- 如何使用Python从C++中读取谷物序列化数据
- 如何使用boost::具有嵌套结构和最小代码更改的序列化
- 带有Protobuf序列化的C++Hazelcast:字符串不是UTF-8格式的
- 自定义对象的dlib序列化在gcc中失败
- C++boost序列化多态性问题
- 增强基于 XML class_id的反序列化
- 提升反序列化对象具有 nan 或 -nan 值
- 在 cpp 中的平面缓冲区中序列化对象
- 每次进行继承时都需要提升::序列化::base_object吗?
- 如何在 c++ 非托管代码中反序列化 byte[] 的 json 字符串?
- 提升序列化 1:73 的向后兼容性问题
- 将 boost 序列化对象的 asio::streambuf 表示转换为 Beast 的 DynamicBody req.body()
- 为什么 nlohmann/json 序列化 "null" 而不是在 double 上"0"?
- 如何反序列化数组?
- 如何使用提升序列化?
- 序列化多晶型接口
- 如何通过 zeromq 发送包含 \0 的序列化跳跃运动帧?