【问题标题】:How to send float[] via UDP + Unsigned-Long-Operator-Curiosity如何通过 UDP + Unsigned-Long-Operator-Curiosity 发送 float[]
【发布时间】:2013-01-06 06:09:50
【问题描述】:

我正在编写一个从设备读取多个电压的 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 数据类型。有什么想法吗?

【问题讨论】:

  • 代替inet_addr(),使用inet_aton()并将addr.sin_addr的地址作为第二个参数传递。

标签: c++ udp char sendto


【解决方案1】:

您始终可以将任何对象变量视为字节序列。为此目的,明确允许(并且不违反别名或构成类型双关语)将任何对象指针重新解释为指向字节数组中第一个元素的指针(即任何char 类型)。

示例:

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 */ }

对于您的情况:

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

write(fd, p, sizeof data);

【讨论】:

  • 要使用此方法,接收方必须知道发送方正在使用的浮点表示。
  • @ShaunMarko:我想说这是执行read 操作的另一方的问题;-)
  • 如果发送者和接收者都理解 IEEE 754 则没有问题。
  • 当然,发送者和接收者必须就正在传输的数据的表示达成一致。关键是接收者不应该天真地认为float data[N]; char *p(reinterpret_cast&lt;char*&gt;(data); read(fd, p, sizeof(data)); 一定会与使用此答案中代码的发送者合作。 C++ 中浮点值的表示是实现定义的。
【解决方案2】:

决定是否要将 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");

【讨论】:

    【解决方案3】:

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

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

    1.41234;1.63756;456345.45634

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

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

    【讨论】:

    • 单精度浮点(和双精度,就此而言)在 IEEE 754-1985 和 -2008 中标准化,Matlab 遵守此标准。是的,您可能必须考虑不同机器之间的字节顺序,但除此之外你很好。您对字符串转换的建议似乎不必要地低效且容易出错。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-26
    • 1970-01-01
    • 2016-07-29
    • 1970-01-01
    • 2018-10-15
    • 2018-11-09
    • 2014-07-13
    相关资源
    最近更新 更多