使用 C++ 和 Qt 通过 UDP 发送 float var

Posted

技术标签:

【中文标题】使用 C++ 和 Qt 通过 UDP 发送 float var【英文标题】:Send float var via UDP with C++ and Qt 【发布时间】:2015-03-31 11:24:16 【问题描述】:

你好,你可以看到我是新来的(在 C++ 和 Qt 中)。

请帮助我,我想通过 UDP 将一些命令从我的应用程序发送到 X-Plane(飞行模拟器)。简而言之,我需要这样发送消息:

DREF0XXXXsim/joystick/yoke_roll_ratio

其中 XXXX 是四个字节的浮点值。 问题是,当我发送像 0 或 0.5 这样的浮点值时,在这些值中,一些字节为 0(?)并且 c++ 认为这是消息的结尾。

我使用 memcpy 将浮点值更改为 4 个字节(字符),但如果其中一些是 0 我的消息结束。

其他值(例如 0.1、0.2 等)都可以。我发现我可以将零更改为例如1 但在这种情况下,当我发送 0.5 值时,我收到 0.50392(当我发送 0.4 时,我收到 0.4000000)。

我使用 Qt 库和这个函数来发送数据:

socket->writeDatagram(const char * data, qint64 size, const QHostAddress & address, quint16 port)

问题是 - 如何发送零字节或浮点值,如 0.5 或 0?

【问题讨论】:

【参考方案1】:

我使用 memcpy 将浮点值更改为 4 个字节(字符),但如果其中一些是 0,我的消息结束。

不,你没有。 memcpy 复制内存,在您的情况下,构成浮点数的 4 字节。您不必这样做,只需在 writeDatagram 之类的地方使用该内存:

writeDatagram(const char * data, qint64 size, const QHostAddress & address, quint16 port)

是signature,所以你可以直接调用

writeDatagram(reinterpret_cast<const char*>(myfloat_pointer), 4, ....)

UDP 和 Qt 真的不关心数据中的内容,所以你的 0 字节问题来自其他东西——我怀疑你的 memcpy 机制;您是否有机会使用strlen 或其他东西来确定要复制多少内存?

【讨论】:

【参考方案2】:

这个

reinterpret_cast<const char*>(myfloat_pointer)

解决了这个问题。我更改了我的代码,现在它可以工作了:

char strToSend[509] = "DREF0";
char c[4];
char *cp = &c[0];
cp = reinterpret_cast<char*>(&pitchValue);
memcpy(&strToSend[5], &cp[0], 4);
std::string dref = "sim/joystick/yoke_pitch_ratio";
memcpy(&strToSend[9], dref.data(), dref.size());
socket->writeDatagram(&strToSend[0], 509, host, 49000);

我不确定这是一个好/漂亮的代码,但它可以工作 - X-Plane 接收正确的数据。

【讨论】:

以上是关于使用 C++ 和 Qt 通过 UDP 发送 float var的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中通过 UDP 发送字符串

QT学习笔记(13) QT下的UDP通信

在 C++ 中通过 UDP 发送缓冲图像

QT下UDP套接字通信——QUdpSocket 简单使用

qt udp/tcp 绑定发送源端口(Specify source UDP port when writing datagram)

qt udp/tcp 绑定发送源端口(Specify source UDP port when writing datagram)