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

时间:2015-03-31 11:24:17

标签: c++ qt udp

你好,你可以在这里看到我新的(以及C ++和Qt)。

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

DREF0XXXXsim/joystick/yoke_roll_ratio

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

我使用memcpy将浮点值更改为4个字节(char),但如果其中一些是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?

2 个答案:

答案 0 :(得分:1)

  

我使用memcpy将float值更改为4个字节(char),但是如果其中一些是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或其他内容来确定要复制的内存量?

答案 1 :(得分:0)

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接收正确的数据。