如何通过UDP + Unsigned-Long-Operator-Curiosity发送float []

时间:2013-01-22 21:23:24

标签: c++ udp char sendto

我正在编写一个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数据类型。关于这个的任何Iideas?

3 个答案:

答案 0 :(得分:5)

您始终可以将任何对象变量视为字节序列。出于这个目的,明确允许(并且不违反别名或构成类型惩罚)将任何对象指针重新解释为指向字节数组中第一个元素的指针(即任何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);

答案 1 :(得分:1)

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

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

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

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

答案 2 :(得分:0)

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

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

1.41234;1.63756;456345.45634

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

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