c++ - 使用 C++ 通过 UDP 将 float 发送到 QuartzComposer

标签 c++ quartz-composer

another question用户提供了一种通过 UDP 将数据发送到 QuartzComposer 的方法。看来 QuartzComposer 对发送给它的字节数据的填充非常讲究。特别是它要求发送的每个字符都以“\0\0\0”开头。

我能够模拟一个快速的 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 + '\0\0\0' + c
s.sendto(out, ('225.0.0.0', PORT))

我需要在 C++ 中实现的关键部分是填充 float 的位。这是关键部分的快速 Python 模型:

def padfloat(n):
    out = ''
    for c in str(n):
        out = out + '\0\0\0' + 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','\0'};
  s.send_to(boost::asio::buffer(test, 12), *iterator);
  std::cout << "Sent\n";
}
  }
  catch (std::exception& e)
  {
std::cerr << "Exception: " << e.what() << "\n";
  }
  return 0;
}

我需要帮助解决的一个相当微不足道的问题是如何接收 float 并将其正确格式化为 char 数组,以便在发送时正确添加所有“\0\0\0”填充。我将要做一些丑陋的事情,但如果有人能指出我一个优雅的修复方法,我会很乐意学习一些东西。

最佳答案

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

  1. 我们进行字符串转换
  2. 创建一个 4 倍大小的缓冲区(加上 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);

关于c++ - 使用 C++ 通过 UDP 将 float 发送到 QuartzComposer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7358613/

相关文章:

c++ - 派生类的this指针是如何找到成员函数的?

xcode - Xcode 4.3 是否包含 Quartz Composer?

macos - Quartz Composer中的系统音频

php - C++ WinInet 只发出 1 个请求

c++ - 如何使用 GDB 从 C++ 函数步调试到 std::function 用户代码?

ios - 我可以在 iOS 上使用 Quartz Composer 吗?

cocoa - QC 组合将黑色和白色像素转换为其他两种颜色

c++ - 如何查找/检测项目中的全局状态?

c++ - 结构像素颜色值