使用C++和Qt通过UDP发送float var
Send float var via UDP with C++ and Qt
你好,你可以在这里看到I new(以及在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?
我使用memcpy将浮点值更改为4个字节(char),但如果其中一些是0,我的消息将结束。
不,你没有。memcpy
复制内存,在您的情况下是组成浮点的4字节。你不必这样做,只需在writeDatagram
:这样的地方使用内存
writeDatagram(const char * data, qint64 size, const QHostAddress & address, quint16 port)
是签名,所以你可以打电话给
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);
我真的不确定这是否是一个好的/漂亮的代码,但它有效-X-Plane接收正确的数据。
相关文章:
- 从命令行c++发送文本文件名
- 发送一个带有libcurl C++问题的帖子请求:s
- 如何通过套接字将文本文件的内容从服务器发送到客户端
- 如何在C++中将函数发送到另一个进程
- boost xml parsingl将xml的路径作为变量发送
- 如何将数组从Objective-C发送到C++函数
- System.InvalidCastException - SQL to C++ - safe_cast<float>
- 如何使用ESP8266向谷歌主页发送命令
- 当服务中的事件被触发时,如何将响应从服务发送回客户端?
- 为什么默认复制函数在按值发送参数时不调用?
- 没有从阵列<float>到阵列<int>的可行转换
- 程序不断发送垃圾邮件号码?
- 如何使用 OpenCV 解码在两个 UWP 应用之间发送的图像字节?
- 如何使用 Google Test 向测试添加元数据 / 如何将数据从 Google Test 发送到 TestEven
- 如何接受 [ENTER] 键作为无效输入并发送错误消息
- Qt:如何使不兼容的发送方/接收方参数兼容?
- 数组下标的类型"float*[float]"无效
- 通过TCP发送std::vector<float>,从boost::asio到QTcpSocket
- 使用C++和Qt通过UDP发送float var
- 如何通过 UDP + 无符号长运算符好奇发送 float[]