使用 C++ 和 Qt 通过 UDP 发送浮点变量
Send float var via UDP with C++ and Qt
你好,如你所见,我是新来的(在 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?
I use memcpy to change float value into 4 bytes (char), but in case that some of them are 0 my message end.
不,你不知道。 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
或其他东西来确定要复制多少内存?
这个
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);
我不太确定这是一个 good/beautiful 代码,但它有效 - X-Plane 接收到正确的数据。
你好,如你所见,我是新来的(在 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?
I use memcpy to change float value into 4 bytes (char), but in case that some of them are 0 my message end.
不,你不知道。 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
或其他东西来确定要复制多少内存?
这个
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);
我不太确定这是一个 good/beautiful 代码,但它有效 - X-Plane 接收到正确的数据。