用c++通过UDP向QuartzComposer发送浮点数

Sending floating point numbers to QuartzComposer via UDP with C++

本文关键字:浮点数 QuartzComposer c++ 通过 UDP      更新时间:2023-10-16

在另一个问题中,用户提供了一个通过UDP向QuartzComposer发送数据的方法。看起来QuartzComposer对发送给它的字节数据的填充非常挑剔。特别地,它要求在发送的每个字符之前加上""。

我能够模拟一个快速的Python程序来解决这个问题:

from socket import *
PORT = 50000
N = 3.14159265358
# connect to Quartz Composer on localhost port 50000
s = socket(AF_INET, SOCK_DGRAM)
s.bind(('', 0))
s.setsockopt(SOL_SOCKET, SO_BROADCAST, 1)
for c in str(N):
    out = out + '' + c
s.sendto(out, ('225.0.0.0', PORT))

我需要在c++中实现的临界区是填充浮点数的位。下面是临界区的快速Python模拟:

def padfloat(n):
    out = ''
    for c in str(n):
        out = out + '' + c
    return out
if __name__ == '__main__':
    print(padfloat(3.14159265358))

无可否认,我的c++能力不是那么强,但我能够使用boost来启动和运行UDP,并发送一个硬编码消息"0.7":

//
// Working C++ to Quartz Network Test
// 
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <boost/asio.hpp>
using boost::asio::ip::udp;
enum { max_length = 1024 };
int main(int argc, char* argv[])
{
  try
  {
boost::asio::io_service io_service;
udp::socket s(io_service, udp::endpoint(udp::v4(), 0));
udp::resolver resolver(io_service);
udp::resolver::query query(udp::v4(), "225.0.0.0", "50000");
udp::resolver::iterator iterator = resolver.resolve(query);
using namespace std; // For strlen.
// TODO: alter code to take in any number
for (;;) {
  std::cout << "Press Any Key to send 0.7: ";
  char request[max_length];
  std::cin.getline(request, max_length);
  // size_t request_length = strlen(request);
  char test [] = {0,0,0,'0',0,0,0,'.',0,0,0,'7',''};
  s.send_to(boost::asio::buffer(test, 12), *iterator);
  std::cout << "Sentn";
}
  }
  catch (std::exception& e)
  {
std::cerr << "Exception: " << e.what() << "n";
  }
  return 0;
}

我需要帮助的相当微不足道的问题是如何接受浮点数,并将其正确格式化为字符数组,以发送所有""填充。我将要做一些丑陋的事情,但如果有人能给我指出一个优雅的修复,我将非常乐意学习一点。

我手边没有编译器,但这应该足够了。

  1. 我们进行字符串转换
  2. 创建一个4倍大小的缓冲区(null终止加1),初始化为0
  3. 每隔4个位置复制一个字符串

我不确定asio是否期望空终止符是其大小的一部分,所以我遵循了您的示例。

float float_value = 4.2f;
std::string str = boost::lexical_cast<std::string>(float_value);
std::vector<char> char_buff((str.size() * 4) + 1, 0);
for (size_t i = 0; i < str.size(); i++)
  char_buff[(i * 4) + 3] = str[i];
s.send_to(boost::asio::buffer(&char_buff[0], char_buff.size()), *iterator);