你好,你可以在这里看到我新的(以及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?
答案 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接收正确的数据。