2

我正在编写一个从设备读取多个电压的 C++ 应用程序。我收到这些测量结果,float[]我想通过 UDP 将此数组发送到 MATLAB 脚本。

C++ 函数 sendto 需要获取char[]缓冲区,我真的不知道如何将其转换float[]char[]缓冲区,因此我可以在 MATLAB 中轻松地重新组装它。有任何想法吗?

我遇到的另一个问题是那条线

addr.sin_addr = inet_addr("127.0.0.1");

inet_addr 返回一个 unsigned long,但我的编译器告诉我 = 运算符在其右侧不接受 unsigend long 数据类型。关于这个的任何想法?

4

3 回答 3

5

You can always treat any object variable as a sequence of bytes. For this very purpose, it is explicitly allowed (and does not violate aliasing or constitute type punning) to reinterpret any object pointer as a pointer to the first element in an array of bytes (i.e. any char type).

Example:

T x;
char const * p = reinterpret_cast<char const *>(&x);

for (std::size_t i = 0; i != sizeof x; ++i) { /* p[i] is the ith byte in x */ }

For your case:

float data[N];
char const * p = reinterpret_cast<char const *>(data);

write(fd, p, sizeof data);
于 2013-01-22T21:32:18.203 回答
1

决定是否要将 UDP 消息格式化为文本或二进制。如果是文本,您可以使用 boost::lexical_cast 将浮点数转换为字符串。您可以以任何您想要的方式(逗号分隔值、换行符分隔等)将 UDP 消息中的字符串值框起来,或者您可以使用已知格式,例如 JSON。

如果要传输二进制数据,请选择已知格式,例如 ONC RPC 使用的 XDR,并使用现有的库工具来创建二进制消息。

至于inet_addr错误,addr.sin_addr是一个struct in_addr。您需要将结果分配给 sin_addr 结构的 s_addr 成员,如下所示:

addr.sin_addr.s_addr = inet_addr("127.0.0.1");
于 2013-01-22T21:47:35.477 回答
0

你的帖子有两个问题。我相信这不是它应该的样子。

至于 float[]->byte[] conersion - 你应该检查 matlab 如何存储它的浮点变量。如果有任何机会,它使用与您的编译器相同的格式,仅用于您的计算机设置等,您可以简单地将它们作为字节数组 [] 发送。在任何其他情况下 - 不兼容的浮点字节格式,多台机器 - 您必须编写手动转换。首先每个浮点数到(例如)字符串,然后是许多浮点数。您的行可能如下所示:

1.41234;1.63756;456345.45634

至于 addr.sin_addr - 我认为你做错了。你应该访问

addr.sin_addr.s_addr = inet_addr("1.1.1.1");

于 2013-01-22T21:37:05.153 回答