В другом вопросе пользователь предоставил метод отправки данных в QuartzComposer через UDP.Похоже, что 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 ++, является бит, который дополняет число с плавающей запятой.Вот краткий макет 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;
}
Довольно тривиальная проблема, с которой мне нужна помощь, заключается в том, как взять число с плавающей запятой и правильно отформатировать его как массив символов для отправки со всеми "\ 0 \"0 \ 0 "заполнение должным образом предварительно.Я собираюсь сделать что-то уродливое, но если кто-нибудь подскажет мне элегантное решение, я буду очень рад узнать немного.