gpt4 book ai didi

c# - 无法使用 Google Protocol Buffer 从 C# 到 C++ 并返回相同的 double

转载 作者:太空宇宙 更新时间:2023-11-03 18:10:03 24 4
gpt4 key购买 nike

我正在尝试在 C# 和 C++ 之间进行通信,并取得了不同程度的成功。

我可以使用回复/请求在两者之间发送消息,但我收到的 double 不正确。

出于调试目的和理解,我目前正在运行以下命令:

Clrzmq 3.0 rc1、Google ProtocolBuffer 2.5、Protobuf-csharp-port-2.4、ZeroMQ-3.2.3

.proto

package InternalComm;

message Point
{
optional double x = 1;
optional double y = 2;
optional string label = 3;
}

server.cpp(相关部分)
while (true) {
zmq::message_t request;

// Wait for next request from client
socket.recv (&request);
zmq::message_t reply (request.size());
memcpy ((void*)reply.data(), request.data(), request.size());
socket.send(reply);
}

client.cs(相关部分)
public static Point ProtobufPoint(Point point)
{
Point rtn = new Point(0,0);
using (var context = ZmqContext.Create())
{
using (ZmqSocket requester = context.CreateSocket(SocketType.REQ))
{
requester.Connect("tcp://localhost:5555");
var p = InternalComm.Point.CreateBuilder().SetX(point.X).SetY(point.Y).Build().ToByteArray();

requester.Send(p);

string reply = requester.Receive(Encoding.ASCII);
Console.WriteLine("Input: {0}", point);

byte[] bytes = System.Text.Encoding.ASCII.GetBytes(reply);
var message = InternalComm.Point.ParseFrom(bytes);
rtn.X = message.X;
rtn.Y = message.Y;

Console.WriteLine("Output: {0}", rtn);
}
}
return rtn;
}

在 C# 方面,Point 是一个非常简单的结构。只有 x 和 y 属性。

这是运行上述代码后我从单元测试中得到的结果。

Input (1.31616874365468, 4.55516872325469)
Output (0.000473917985115791, 4.55516872323627)

Input (274.120398471829, 274.128936418736)
Output (274.077917334613, 274.128936049925)

Input (150.123798461987, 2.345E-12)
Output (145.976459594794, 1.11014954927532E-13)

Input (150, 0)
Output (145.96875, 0)



我认为问题在于我的 protobuf 代码不正确(怀疑这是 Skeet 方面的错误)。我也在假设 server.cpp 没有对消息做任何事情而是按原样返回它。

想法?

最佳答案

requestor.Receive(Encoding.ASCII) call 旨在接收字符串,而不是字节 block 。您在问 ZmqSocket实例将消息作为 ASCII 字符串返回,这很可能会导致对内容的修改。如果您要发送一个字节数组,请接收一个字节数组。

试试这个:

int readSize;
byte[] reply = requester.Receive(null, out readSize);
var message = InternalComm.Point.ParseFrom(reply);
readSize变量将包含接收 block 中的实际有效字节数,可能与 reply 的大小不同。数组,因此您可能需要对数组进行切片以使其适合 ProtoBuf。

关于c# - 无法使用 Google Protocol Buffer 从 C# 到 C++ 并返回相同的 double ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17646483/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com