[英]Sending floating point numbers to QuartzComposer via UDP with C++
在另一個問題中 ,用戶提供了一種通過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 ++中實現的關鍵部分是填充浮點數的位。 這是關鍵部分的快速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;
}
我需要幫助的一個相當瑣碎的問題是如何采用浮點數並將其正確格式化為char數組,以便在正確填充所有“ \\ 0 \\ 0 \\ 0”填充的情況下發出。 我將要做一些丑陋的事情,但是如果有人可以指出我的解決方法,我很樂於學習。
我沒有一個方便的編譯器,但這足夠了。
我不確定asio是否希望null終止符成為其大小的一部分,因此我遵循了您的示例。
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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.